我试图复制通过向量中的构造函数传递的值。这是代码:
class Foo {
public:
template<typename T>
Foo(T begin, T end)
{
std::copy(begin, end, data.begin());
}
void printVector()
{
cout << data.size();
}
protected:
std::vector<double> data;
};
主要:
std::vector<double> data = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
Foo::Foo f(
std::begin(data),
std::begin(data)
);
f.printVector();
有人可以解释为什么这不起作用?另外,如果我有一个std::vector<vector<double> > data
2D矢量,并且我传入了2D矢量的迭代器,是否可以将其复制到2D矢量?
由于
答案 0 :(得分:5)
首先,您的矢量数据成员的大小为0
,因此您不能以std::copy
方式执行此操作。您应该使用构造函数初始化列表从两个迭代器初始化数据成员:
template<typename T>
Foo(T begin, T end) : data(begin, end) {}
其次,您没有尝试复制任何元素。这完全被打破了:
Foo::Foo f(
std::begin(data),
std::begin(data)
);
应该是
Foo f(std::begin(data), std::end(data));
答案 1 :(得分:2)
您必须分配空间,vector::begin
不会为您执行此操作。您也可以使用push_back_inserter
。
此外,请使用std::begin(data)
两次Foo
。
答案 2 :(得分:2)
你有
Foo::Foo f(
std::begin(data),
std::begin(data)
);
你的意思是
Foo::Foo f(
std::begin(data),
std::end(data) //<- note the change
);
此外,您尚未在构造函数中为副本的目标留出空间,因此您需要使用back_inserter
std::copy(begin, end, std::back_inserter(data));