2009-04-16 5 views
22

ich einige Code gegen eine C++ API zu schreiben, die Vektoren von Vektoren von Vektoren nimmt, und es wird immer langweilig Code wie folgt aus der ganzen Ort zu schreiben:C++ Vektor Literale oder so etwas wie sie

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); 
... 

Hat C++ eine Vektor-Literal-Syntax? I.e., etwas wie:

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

Gibt es einen nicht eingebauten Weg, dies zu erreichen?

+1

Niemand hat meine schlechten Klammern gefangen! –

+1

Ich habe Ihre Klammern vielleicht nicht abgefangen, aber ich habe Ihre nicht übereinstimmenden Variablennamen und ein fehlendes Semikolon gefangen! ;) –

+0

fast, aber nicht ganz ... –

Antwort

34

In C++0xwill be able Sie die gewünschte Syntax:

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

Aber in der heutigen C++ Sie mit boost.assign beschränkt sind, die Sie tun können:

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, ...; 

... oder Qt's containers mit der Lassen Sie es auf einmal tun:

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

Die andere Halb vernünftige Möglichkeit, zumindest für flache Vektoren wird von einer Anordnung zu konstruieren:

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

Ich würde empfehlen, einen automatisierten Weg zum Abrufen der Array-Größe, wie der hier von Litb geschrieben: http://stackoverflow.com/questions/437150/can-someone-explain -this-template-code-das-gibt-mir-die-größe-eines-arrays –

+2

Ja, sicher. Ich wollte die Antwort nicht komplizieren. –

3

Im Grunde gibt es keine eingebaute Syntax, weil C++ nicht über Vektoren Ether weiß; Sie sind nur aus einer praktischen Bibliothek.

Das heißt, wenn Sie eine komplizierte Datenstruktur laden, sollten Sie es aus einer Datei oder etwas ähnliches trotzdem laden; der Code ist sonst zu spröde.

+0

sollte nicht nur eine solche Struktur nicht fest codiert sein, aber ich denke, die Tatsache, dass solche verschachtelten Vektoren direkt manipuliert werden, ist ein Code-Geruch ... es sollte wahrscheinlich eine Klasse geben, die einiges oder alles einkapselt. – rmeador

+1

STL ist nicht nur eine _convenient_ Bibliothek, es ist eine ** Standard ** Bibliothek. C++ ist in Schichten aufgebaut, aber das bedeutet nicht, dass die Stücke in einem Vakuum gebaut wurden. –

+1

Sie haben Recht, ich finde STL nicht so praktisch eine Bibliothek. –

Verwandte Themen