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

我会用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.
}

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

于 2013-11-13T19:06:17.493 回答