在一行中使用带有“temp”结构的向量push_back(如果可能)

时间:2013-11-13 18:45:00

标签: c++ vector struct

我有以下代码(butchered使它变得小而具体):

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%确信它是正确的...任何指针(没有双关语意)在这里?

2 个答案:

答案 0 :(得分: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" ));

答案 1 :(得分:1)

我会用 emplace_back 代替 push_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.
}

这样您就不必创建单独的变量,并且使用emplace_back而不是push_back更有效,因为向量不必复制myType_t实例。
(总的来说,我发现类型有明确的构造函数和必要的参数是有益的。)

如果编译器不支持emplace_back,您仍然可以将此方法与push_back一起使用:

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

此解决方案的唯一缺点是在插入向量时将复制对象。