2012-01-26 20 views
5

Deseo inicializar un vector usando una matriz de std::string s.Inicializando un vector de std :: cadena con una matriz

Tengo la siguiente solución, pero me pregunto si hay una forma más elegante de hacerlo.

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec; 
vec = vector<std::string>(str, str + (sizeof (str)/sizeof (std::string))); 

Podría, por supuesto, que esto sea más legible para definir el tamaño de la siguiente manera:

int size = (sizeof (str)/sizeof (std::string)); 

y reemplazando el vector de inicialización con:

vec = vector<std::string>(str, str + size); 

Pero esto todavía se siente una poco "poco elegante".

+0

Ver http://stackoverflow.com/questions/231491/how-to-initialize-const-stdvectort-like-ac-array –

Respuesta

4

bien no se necesita el paso intermedio:

std::string str[] = { "one", "two", "three", "four" }; 
vector<std::string> vec(str, str + (sizeof (str)/sizeof (std::string))); 

En C++ 11 que sería capaz de poner la llave de inicialización en el constructor utilizando la lista de inicialización del constructor.

+0

Gracias, yo no estaba seguro de si me había perdido completamente cualquier otro métodos potenciales de inicialización de cosas. –

3

En C++ 11, tenemos std::begin y std::end, que funcionan tanto para los contenedores de tipo STL y construido en matrices:

#include <iterator> 

std::vector<std::string> vec(std::begin(str), std::end(str)); 

aunque, como se ha mencionado en los comentarios, por lo general, no lo hará necesitará la matriz intermedia en absoluto:

std::vector<std::string> vec {"one", "two", "three", "four"}; 

en C++ 03, se puede utilizar una plantilla para deducir el tamaño de la matriz, ya sea para implementar su propia begin y end, o para inicializar la matriz directamente:

template <typename T, size_t N> 
std::vector<T> make_vector(T &(array)[N]) { 
    return std::vector<T>(array, array+N); 
} 

std::vector<std::string> vec = make_vector(str); 
+2

En C++ 11 tenemos los inicializadores adecuados, sin necesidad del primero de sus métodos. –

+0

@KonradRudolph: buen punto (aunque la pregunta específicamente pregunta sobre la inicialización desde una matriz, entonces dejaré ese método en la respuesta). –

+2

Mucho antes de C++ 11, teníamos 'begin' y' end' en nuestro kit de herramientas personales. Y son principalmente relevantes para pre-C++ 11. –

Cuestiones relacionadas