c ++ 11向量初始化函数调用

时间:2012-12-20 15:50:51

标签: c++ vector c++11

我对在c ++ 11中定义向量的新快捷方式有疑问。假设我有以下课程

struct Tester{

  vector< vector<int> > data;

  Tester(){
    data = vector< vector<int> >();
  }

  void add(vector<int> datum){
    data.push_back(datum);
  }

};

然后,以下工作按预期进行:

int main(){
    Tester test = Tester();
    vector<int> datum = vector<int>{1,2,3};
    test.add(datum);
}

但这不是:

int main(){
    Tester test = Tester();
    test.add(vector<int>{1,2,3});
}

有人可以向我解释一下这个区别吗?如何在第二个main()?

中执行我尝试的快捷方式

2 个答案:

答案 0 :(得分:25)

您的代码似乎没问题,但您使用的编译器不是(这似乎很旧)。

顺便说一下,你做得太多了。

这应该足够了:

vector<int> datum{1,2,3}; //initialization

test.add({1,2,3}); //create vector<int> on the fly and pass it to add()

不要忘记更新编译器。

此外,行data = vector< vector<int> >();也太多了。这不是必需的。向量是自动构造的,这意味着您可以将类的构造函数留空,或者根本不使用它,因为它无论如何都不会做任何事情。

答案 1 :(得分:1)

如果您想避免数据复制:

#include <vector>
#include <iostream>

using namespace std;

struct Tester
{
    vector< vector<int> > data;

    Tester()
    {
        data = vector< vector<int> >();
    }

    void add(vector<int> && datum)
    {
        data.push_back(std::move(datum));
    }

};


int main()
{
    Tester test = Tester();
    test.add(vector<int>{1,2,3});

    for(const auto &v : test.data[0])
        std::cout << v << std::endl;
}