30

ベクトルのベクトルを受け取る 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", ... }, ... }, ... }

これを達成するための非組み込みの方法はありますか?

4

3 に答える 3

42

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);
于 2009-04-16T21:26:01.440 に答える
5

Boost assign library を確認してください。

于 2009-04-16T21:26:25.993 に答える
4

基本的に、C++ はベクトル イーサを認識しないため、これを行うための組み込み構文はありません。それらは便利なライブラリからのものです。

とはいえ、複雑なデータ構造をロードする場合は、ファイルなどからロードする必要があります。そうしないと、コードが脆すぎます。

于 2009-04-16T21:28:21.840 に答える