Векторные литералы С++ или что-то в этом роде

Я пишу некоторый код для C++ 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);
...

Есть ли в C++ синтаксис векторного литерала? То есть что-то вроде:

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

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


person Chris Conway    schedule 16.04.2009    source источник


Ответы (3)


В 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);
person Community    schedule 16.04.2009
comment
Я бы порекомендовал использовать автоматический способ получения размера массива, как тот, который опубликован litb здесь: stackoverflow.com/questions/437150/ - person David Rodríguez - dribeas; 17.04.2009
comment
Да, конечно. Не хотел усложнять ответ. - person ; 17.04.2009
comment
С++ 0x теперь существует и был переименован в С++ 11. - person Antony; 21.08.2020

Ознакомьтесь с библиотекой назначения Boost.

person Fred Larson    schedule 16.04.2009

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

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

person Charlie Martin    schedule 16.04.2009
comment
не только такая структура не должна быть жестко запрограммирована, но я думаю, что тот факт, что такими вложенными векторами манипулируют напрямую, является запахом кода... вероятно, должен быть класс, инкапсулирующий часть или все это. - person rmeador; 17.04.2009
comment
STL — это не просто удобная библиотека, это стандартная библиотека. C++ построен слоями, но это не значит, что его части были построены в вакууме. - person Trade-Ideas Philip; 06.01.2014
comment
Вы правы, я не считаю STL такой уж удобной библиотекой. - person Charlie Martin; 07.01.2014
comment
@CharlieMartin Pre-C++11, я согласен. Настоящее время? Нисколько. - person minexew; 10.04.2016
comment
Обратите внимание на дату вопроса. - person Charlie Martin; 10.04.2016