jueves, 31 de enero de 2013

Inicializar un std::vector en C++

Lo primero que tenemos que hacer es crear la plantilla que se va a utilizar para inicializar los vectores:

template <typename T>
class init_vector {

public:

init_vector<T>& operator<< (const T& value) {
    internal_vector.push_back(value);
    return *this;
}

operator std::vector<T>() const {
    return internal_vector;
}

private:

std::vector<T> internal_vector;

};

A la hora de inicializar un vector podemos utilizar esta plantilla de manera muy sencilla y elegante:

std::vector<int> v = init_vector<int>() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9;
std::vector<string> empresas = init_vector<string>() << "Google" << "Microsoft" << "Apple" << "Nokia";



Bucles for basados en rango, Inferencia de tipo y Referencia

#include <vector>

int main()
{
    std::vector<string>meses;
    meses.push_back("Enero");
    meses.push_back("Febrero");
    meses.push_back("Marzo");
    meses.push_back("Abril");
    meses.push_back("Mayo");
    meses.push_back("Junio");
    meses.push_back("Julio");
    meses.push_back("Agosto");
    meses.push_back("Septiembre");
    meses.push_back("Octubre");
    meses.push_back("Noviembre");
    meses.push_back("Diciembre");

    // Mostrar en consola los meses utilizando un bucle for basado en rango.    

   for (string m: meses) {
       cout << m << endl;
        //m = "cadena_no_se_puede_modificar";
   }
   


    // Con inferencia de tipo.
   for (const auto m: meses) {
       cout << m << endl;
       //m = "cadena_no_se_puede_modificar";
   }

    // Con inferencia de tipo y referencia

    for (auto& m: meses) {
       cout << m << endl;
       m = "cadena_modificada";
   }
}