2012-01-18 32 views
167

Possible Duplicate:
C++: Easiest way to initialize an STL vector with hardcoded elementscómo inicializar un vector en C++

que desea inicializar un vector, como lo hacemos en el caso de una matriz.

Ejemplo

int vv[2] = {12, 43}; 

Pero cuando lo haga de esta manera,

vector<int> v(2) = {34, 23}; 

O

vector<int> v(2); 
v = {0, 9}; 

da un error:

expected primary-expression before ‘{’ token

Y

error: expected ‘,’ or ‘;’ before ‘=’ token

respectivamente.

+3

También hay [cómo-inicializar 'const std :: vector ' como matriz ac] (http://stackoverflow.com/questions/231491/how- to-initialize-const-stdvectort-like-ac-array/254143). – Shadow2531

+0

Debe habilitar el soporte de C++ 11 en su compilador, p. 'g ++ -std = C++ 11 your_file.cc'. Entonces puede usar el constructor de la lista de inicializadores del hilo (el último elemento en [esta referencia] (http://en.cppreference.com/w/cpp/container/vector/vector)) –

+1

No es una tontería - la otra pregunta es cómo hacerlo con C++ viejo, la respuesta de WTF es cómo hacerlo ahora –

Respuesta

234

Con el nuevo estándar C++ (puede necesitar opciones especiales que esté disponible en su compilador) puede simplemente hacer:

std::vector<int> v { 34,23 }; 
// or 
// std::vector<int> v = { 34,23 }; 

O incluso:

std::vector<int> v(2); 
v = { 34,23 }; 

En los compiladores que no son compatibles esta característica (listas de inicializador) aún puede emular esto con una matriz:

int vv[2] = { 12,43 }; 
std::vector<int> v(&vv[0], &vv[0]+2); 

O, para el caso de asignación a un vector existente:

int vv[2] = { 12,43 }; 
v.assign(&vv[0], &vv[0]+2); 

Al igual que James Kanze sugirió, es más robusto que tienen funciones que le dan al principio y al final de una matriz:

template <typename T, size_t N> 
T* begin(T(&arr)[N]) { return &arr[0]; } 
template <typename T, size_t N> 
T* end(T(&arr)[N]) { return &arr[0]+N; } 

Y entonces usted puede hacer esto sin tener repetir el tamaño de todo:

int vv[] = { 12,43 }; 
std::vector<int> v(begin(vv), end(vv)); 
+15

O simplemente: std :: vector v (vv, vv + 2); –

+8

O más robusto: 'std :: vector v (begin (w), end (w);'. El 'begin' y' end' son estándar en C++ 11 (pero luego no los necesita) , pero debería estar en su kit de herramientas de lo contrario –

+1

Sé que esta es una vieja pregunta, pero ¿qué está haciendo exactamente aquí: 'std :: vector v (& vv [0], & vv [0] +2);'?Lo que veo es que estás construyendo un vector con espacio para valores '& vv [0]' (que será una dirección de memoria), y llenando cada espacio en el vector con '& vv [0] + 2' ... Eso estaría usando el constructor 2 en esta página: http://en.cppreference.com/w/cpp/container/vector/vector sin proporcionar el tercer argumento, que por defecto es Allocator(). Sé que me estoy perdiendo algo. –

27

también se puede hacer así:

template <typename T> 
class make_vector { 
public: 
    typedef make_vector<T> my_type; 
    my_type& operator<< (const T& val) { 
    data_.push_back(val); 
    return *this; 
    } 
    operator std::vector<T>() const { 
    return data_; 
    } 
private: 
    std::vector<T> data_; 
}; 

Y utilizar de esta manera:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3; 
+0

¿Es posible mover * data_ * a * v * en lugar de llamar al constructor de copia? – Per

+1

¡Hola, por! Supongo que le gusta esto (advertencia, no probado): operator std :: vector &&() { return std :: move (data_); } –

Cuestiones relacionadas