2009-04-16 13 views
22

Piszę niektóre kodu przeciwko C++ API, które wykonuje wektory wektory wektory, i robi się nużące napisać kod jak poniżej wszędzie:C++ literały wektorowej lub coś im

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

Czy C++ ma składnię literału wektorowego? Np. Coś w rodzaju:

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

Czy istnieje sposób, aby to zrobić?

+1

Nikt nie złapał moich złych nawiasów! –

+1

Być może nie złapałem twoich nawiasów, ale na pewno złapałem twoje niedopasowane nazwy zmiennych i brakujący średnik! ;) –

+0

prawie, ale nie do końca ... –

Odpowiedz

34

W C++0x ty will be able używać żądany składnię:

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

Ale w dzisiejszym C++ jesteś ograniczony do korzystania boost.assign który pozwala zrobić:

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

... lub za pomocą Qt's containers który możesz to zrobić za jednym razem:

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

Innym rozwiązaniem pół normalny przynajmniej płaskich wektorów jest konstrukcja z tablicy:

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

Polecam za pomocą automatycznego sposobu pobierania rozmiaru tablicy, jak ten opublikowany przez litb tutaj: http://stackoverflow.com/questions/437150/can-someone-explain -to-szablon-kod-to-daje-mi-rozmiar-tablicy-tablicy –

+2

Tak, oczywiście. Nie chciałem komplikować odpowiedzi. –

3

Zasadniczo nie ma wbudowanej składni, aby to zrobić, ponieważ C++ nie wie o wektorach eterowych; są po prostu z wygodnej biblioteki.

Mimo to, jeśli ładujesz skomplikowaną strukturę danych, powinieneś załadować ją z pliku lub czegoś podobnego; w przeciwnym razie kod jest zbyt łamliwy.

+0

nie tylko taka struktura nie powinna być sztywno zakodowana, ale myślę, że fakt, że takie zagnieżdżone wektory są bezpośrednio manipulowane, jest zapachem kodu ... prawdopodobnie powinna istnieć klasa zamykająca niektóre lub wszystkie z nich. – rmeador

+1

STL to nie tylko biblioteka _convenient_, to ** standardowa biblioteka **. C++ jest zbudowany w warstwach, ale to nie znaczy, że elementy zostały zbudowane w próżni. –

+1

Masz rację, nie znajduję STL tak wygodnej biblioteki. –