C ++ векторные литералы, или что-то подобное - PullRequest
23 голосов
/ 17 апреля 2009

Я пишу некоторый код для API C ++, который принимает векторы векторов, и становится утомительно писать код, подобный следующему:

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 ++ векторный литеральный синтаксис? Т.е. что-то вроде:

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

Есть ли не встроенный способ сделать это?

Ответы [ 3 ]

37 голосов
/ 17 апреля 2009

В C ++ 0x Вы сможете использовать желаемый синтаксис:

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

Но в сегодняшнем C ++ вы можете использовать boost.assign , который позволяет вам:

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

... или используя контейнеры Qt , которые позволяют вам сделать это за один раз:

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

Другой полусумный вариант, по крайней мере для плоских векторов, состоит в построении из массива:

string a[] = { "x", "y", "z" };
vector<string> vec(a, a + 3);
5 голосов
/ 17 апреля 2009
4 голосов
/ 17 апреля 2009

По сути, для этого нет встроенного синтаксиса, потому что C ++ не знает о векторном эфире; они просто из удобной библиотеки.

Тем не менее, если вы загружаете сложную структуру данных, вы все равно должны загрузить ее из файла или чего-то подобного; в противном случае код слишком хрупкий.

...