2

次のコードがあります(小さくて具体的なものにするために解体されています):

struct myType_t
{
    int a;
    string str;
};
typedef vector<myType_t> dataVect_t; // Just for ease of use

...main(...)
{
    dataVect_t myData;
    myData.push_back((myType_t) {1, "test"}); // THIS IS THE LINE IN QUESTION!
}

編集:申し訳ありませんが、これは myType_t (dataVect_t ではない) のインスタンスを作成するように修正されています

intStringPairVect_t のインスタンスをベクターにプッシュバックしたいのですが、これを行うためだけに変数を作成したくありません。私がやっていることはコンパイルされているようですが、それが正しいと100%確信しているわけではありません...ここに何かポインタがありますか?

4

2 に答える 2

5

あなたはこれを求めている

myData.push_back( myType_t { 1, "test" });
                  ~~~~~~~~

均一な初期化子を使用して のオブジェクトを作成しますmyType_t


C++11 を使用していない場合は、コンストラクターを定義して、次の方法で同じことを行うことができます()

struct myType_t
{
    myType_t(int a, string str) : a(a), str(str){}
    int a;
    string str;
};

myData.push_back( myType_t ( 1, "test" ));
于 2013-11-13T18:50:39.463 に答える
1

push_backの代わりにemplace_backを使用します。

struct myType_t
{
    myType_t(int a, string str) : a(a), str(str) { }
    int a;
    string str;
};
typedef vector<myType_t> dataVect_t; // Just for ease of use

main(...)
{
    dataVect_t myData;
    myData.emplace_back(1, "test"); // Emplacing directly.
}

この方法では、別の変数を作成する必要がなく、push_back の代わりに emplace_back を使用する方が効率的です。これは、ベクトルが myType_t インスタンスをコピーする必要がないためです。
(そして、一般的に、型が必要なパラメーターを持つ明示的なコンストラクターを持つことは有益だと思います。)

emplace_back がコンパイラでサポートされていない場合でも、push_back でこのアプローチを使用できます。

main(...)
{
    dataVect_t myData;
    myData.push_back(myType_t(1, "test")); // Push back by creating an object.
}

このソリューションの唯一の欠点は、オブジェクトがベクターに挿入されるときにコピーされることです。

于 2013-11-13T19:06:17.493 に答える