2013-08-16 63 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));