2009-04-16 10 views
22

estoy escribiendo algo de código contra una API C++ que tiene vectores de vectores de vectores, y se está haciendo tedioso de escribir código como el siguiente por todo el lugar:C++ literales vectoriales, o algo parecido

vector<string> vs1; 
vs1.push_back("x"); 
vs1.push_back("y"); 
... 
vector<string> vs2; 
... 
vector<vector<string> > vvs1; 
vvs1.push_back(vs1); 
vvs1.push_back(vs2); 
... 
vector<vector<string> > vvs2; 
... 
vector<vector<vector<string> > > vvvs; 
vvvs.push_back(vvs1); 
vvvs.push_back(vvs2); 
... 

¿C++ tiene una sintaxis literal de vector? Es decir, algo como:

vector<vector<vector<string>>> vvvs = 
    { { {"x","y", ... }, ... }, ... } 

¿Existe alguna forma no integrada de lograr esto?

+1

¡Nadie captó mis corchetes! –

+1

Puede que no haya atrapado sus corchetes, pero estoy seguro de que ha detectado los nombres de las variables que no coinciden y ¡falta un punto y coma! ;) –

+0

casi, pero no del todo ... –

Respuesta

34

En C++0x que will be able de usar la sintaxis deseada:

vector<vector<vector<string> > > vvvs = 
    { { {"x","y", ... }, ... }, ... }; 

Pero en C de hoy ++ está limitado al uso de boost.assign, que le permite hacer:

vector<string> vs1; 
vs1 += "x", "y", ...; 
vector<string> vs2; 
... 
vector<vector<string> > vvs1; 
vvs1 += vs1, vs2, ...; 
vector<vector<string> > vvs2; 
... 
vector<vector<vector<string> > > vvvs; 
vvvs += vvs1, vvs2, ...; 

... o el uso de Qt's containers cuales le permite hacerlo de una vez:

QVector<QVector<QVector<string> > > vvvs = 
    QVector<QVector<QVector<string> > >() << (
     QVector<QVector<string> >() << (
      QVector<string>() << "x", "y", ...) << 
      ...) << 
     ... 
    ; 

La otra opción semi-cuerdo, al menos para los vectores planas, es construir a partir de una matriz:

string a[] = { "x", "y", "z" }; 
vector<string> vec(a, a + 3); 
+3

Recomendaría utilizar una forma automática de recuperar el tamaño de la matriz, como el publicado por litb aquí: http://stackoverflow.com/questions/437150/can-someone-explain -this-template-code-that-gives-me-the-size-of-a-array –

+2

Sí, claro. No quería complicar la respuesta. –

3

Básicamente, no hay una sintaxis incorporada para hacerlo, porque C++ no sabe acerca de los vectores éter; solo son de una biblioteca conveniente.

Dicho esto, si está cargando una estructura de datos complicada, debe cargarla desde un archivo o algo similar; el código es demasiado frágil de lo contrario.

+0

, no solo no se debe codificar dicha estructura, sino que creo que el hecho de que dichos vectores anidados se manipulen directamente es un olor a código ... probablemente debería haber una clase que encapsule todo o parte de eso. – rmeador

+1

STL no es solo una biblioteca _convenient_, es una biblioteca ** estándar **. C++ está construido en capas, pero eso no significa que las piezas se construyeron en el vacío. –

+1

Tienes razón, no creo que STL sea tan conveniente como una biblioteca. –

Cuestiones relacionadas