С++ векторных литералов или что-то вроде них
Я пишу какой-то код против С++ API, который принимает векторы векторов векторов, и становится утомительно писать код, как и все по всему месту:
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);
...
Имеет ли С++ синтаксис векторного литерала? I.e, что-то вроде:
vector<vector<vector<string>>> vvvs =
{ { {"x","y", ... }, ... }, ... }
Есть ли встроенный способ сделать это?
Ответы
Ответ 1
В С++ 0x вы сможете использовать желаемый синтаксис:
vector<vector<vector<string> > > vvvs =
{ { {"x","y", ... }, ... }, ... };
Но в сегодняшнем С++ вы ограничены использованием 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);
Ответ 2
Отъезд Boost назначить библиотеку.
Ответ 3
В принципе, для этого нет встроенного синтаксиса, потому что С++ не знает про векторы ether; они просто из удобной библиотеки.
Тем не менее, если вы загружаете сложную структуру данных, вы должны загрузить ее из файла или что-то подобное в любом случае; в противном случае код слишком хрупкий.