21

我对在 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() 中尝试的快捷方式?

4

2 回答 2

26

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

顺便说一句,你做的太多了。

这应该足够了:

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> >();也太多了。它不是必需的。向量是自动构造的,这意味着您可以将类的构造函数留空,或者根本不拥有它,因为它无论如何都不做任何事情。

于 2012-12-20T15:53:28.920 回答
2

如果要避免数据复制:

#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;
}
于 2016-10-25T12:31:33.787 回答