2010-11-24 30 views
50

¿Sería posible inicializar una matriz vectorial de cadenas?Inicializar una matriz vectorial de cadenas

por ejemplo:

static std::vector<std::string> v; // declarado como un miembro de la clase

Solía ​​static simplemente para inicializar y llenarlo con cuerdas. ¿O debería llenarlo en el constructor si no se puede inicializar como hacemos los arreglos normales?

+0

inicializarlo con qué, exactamente? Por supuesto, hay innumerables formas de inicializarlo. –

+0

'static' no lo" llena con cadenas ". Std :: vector es una estructura de datos dinámica y se crea vacía. – Blastfurnace

+0

'static' en este contexto significa que varias instancias de tu clase comparten el mismo' v', ¿eso es lo que realmente quieres? – birryree

Respuesta

55

Ordenar por:

class some_class { 
    static std::vector<std::string> v; // declaration 
}; 

const char *vinit[] = {"one", "two", "three"}; 

std::vector<std::string> some_class::v(vinit, end(vinit)); // definition 

end es sólo por lo que no tengo que escriba vinit+3 y manténgalo actualizado si la longitud cambia más tarde. Definirla como:

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

eh maldita sea, no incluí una plantilla inteligente para hacer 'end' :) –

+0

¿puedo simplemente usar int numElements = sizeof (vinit)/4; – cpx

+0

@cpx: si 'sizeof (char *)' es 4, sí. No tanto en una máquina de 64 bits. Me aburro de escribir un montón de cosas 'sizeof' cada vez que itero una matriz. Mi función 'end' tiene el mismo efecto para las matrices que' std :: end' en C++ 0x. –

14
const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + 4); 

Y en C++ 0x, se puede tomar ventaja de std::initializer_list<>:

http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists

+1

+1 por mencionar la manera fácil en C++ 0x, lástima MSVC 2010 no admite este comportamiento todavía :( – rubenvb

5

mismo que @ Moo-Jugo:

const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size 
+1

¿no supone esto que todos los argumentos [] en la lista de inicio tienen el mismo tamaño? – jwillis0720

+1

@ jwillis0720: todos los argumentos [n] son ​​en realidad del mismo tamaño, sizeof (char *) para ser precisos. La razón es que args almacena un puntero (char *) en la "cosa", no en la "cosa" en sí misma. –

9

MSVC Solución 2010, ya que no es compatible con std::initializer_list<> para vectores, pero admite std::end

const char *args[] = {"hello", "world!"}; 
std::vector<std::string> v(args, std::end(args)); 
22

Si está utilizando cpp11 (activar con la bandera -std=c++0x si es necesario), entonces puede simplemente inicializar el vector de la siguiente manera:

// static std::vector<std::string> v; 
v = {"haha", "hehe"}; 
2

Es 2017, pero este hilo es superior en mi motor de búsqueda , hoy se prefieren los métodos siguientes (listas de inicializador)

std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" }; 
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" }); 
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" }; 

Desde https://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists

Cuestiones relacionadas