-2

我正在尝试复制通过向量内的构造函数传递的值。这是代码:

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> > data2D 向量,并且我传入了 2D 向量的迭代器,是否可以将其复制到 2D 向量?

谢谢

4

3 回答 3

5

首先,您的矢量数据成员具有 size 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));
于 2013-08-16T09:42:27.073 回答
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)); 
于 2013-08-16T09:44:26.237 回答
2

您必须分配空间,vector::begin而不是为您分配空间。您也可以使用push_back_inserter.

此外,使用 givestd::begin(data)两次 to Foo

于 2013-08-16T09:42:31.323 回答