我对在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()?
中执行我尝试的快捷方式答案 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;
}