2013-08-16 60 views
-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> > data二维矢量,并且我传递了二维矢量的迭代器,是否可以将其复制到二维矢量?

感谢

+0

当你说“不工作”时,你应该给出更多细节。发生了什么? – doctorlove

回答

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)); 
+0

我重新调整了矢量大小:'data.resize(10);'并使用了'back_inserter(data))',这没有奏效。我哪里会出错?谢谢你的回答 – Phorce

+0

谢谢。但是,我如何访问'数据'我可以使用:'std :: begin(data)'等等..在构造函数中传递给矢量? – Phorce

+1

@ user1326876如果你的意思是'数据'是'Foo'的数据成员,那么是的,你可以在'Foo'类中使用它。不幸的是,你的代码中有两件名为'data'的东西,这会让你的问题不清楚。 – juanchopanza

2

您必须分配空间,vector::begin不会为你做。您也可以使用push_back_inserter

此外,利用给std::begin(data)两次Foo

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));