2013-03-18 38 views
1

我想用自己的迭代器編寫圍繞std::liststd::vector的包裝類,以便我可以爲這兩個類及其迭代器編寫超類。我當前的代碼基本上是這樣的:用C++中的迭代器在stl類中編寫包裝

template <class T> 
class MyCollection 
{ 
//Not sure how to write this class. 
public: 
    class iterator 
    { 
     //Not sure how to write this class either 
     //I think MyVector::iterator and MyList::iterator 
     //should inherit from this class 
    }; 
}; 

template<class T> 
class MyVector : public MyCollection<T> 
{ 
private: 
    vector<T> data; 
public: 
    MyVector(int * start, int * end) : data(start, end) {} 
    class iterator : vector<T>::iterator 
    { 
     iterator(typename vector<T>::iterator i) : vector<T>::iterator(i) {} 
    }; 
    iterator begin() { return iterator(data.begin()); } 
}; 

template<class T> 
class MyList : public MyCollection<T> 
{ 
private: 
    list<T> data; 
public: 
    Mylist(int * start, int * end) : data(start, end) {} 
    class iterator : list<T>::iterator 
    { 
     iterator(typename list<T>::iterator i) : list<T>::iterator(i) {} 
    }; 
    iterator begin() { return iterator(data.begin()); } 
}; 

我希望能有一些代碼,這是否:

int ints[] = {1,2,3,4,5}; 
MyList<int> l(ints, ints+5); 
MyCollection<int> * c = &l; 
MyCollection<int>::iterator i = c->begin(); 

和代碼執行後,我希望能夠遍歷通過MyList l使用i

我覺得需要virtual begin()成員函數MyCollection,但我不知道什麼是正確的返回類型應該是。

我試圖做甚至可能嗎?目前我的代碼組織完全有可能是完全錯誤的。這正是我所嘗試過的。我的目標是獲得它,以便上面的示例驅動程序代碼可以工作,因此答案可能涉及代碼的全面重組。我真的只是在尋找建議。我不需要一個完整的答案。

+0

爲什麼你需要標準模板的超類?以前從未見過。 – 2013-03-18 17:47:46

+0

@BoPersson,這是一個家庭作業。我不想找到問題的答案。只是一些指導。 – Daniel 2013-03-18 17:48:18

+0

一個問題是'std :: list :: iterator'是一個'BidirectionalIterator',而'std :: vector :: iterator'是一個'RandomAccessIterator'。你可以做的最好的做法是使'MyCollection :: iterator'具有'BidirectionalIterator'的功能(看作'RandomAccessIterator'需要'BidirectionalIterator')。你不能使它具有'RandomAccessIterator'所具有的功能,因爲這對於'std :: list :: iterator'完全不起作用。 – Cornstalks 2013-03-18 18:09:19

回答

0

在這種情況下,我不會爲std::vectorstd::list編寫包裝,僅用於統一使用std :: list或std :: vector的唯一目的。你不需要。 你想要的是使用類型擦除類似的方式,你可以找到here

你的整個想法是隻實現MyCollection<T>與類型擦除迭代器和使用類型擦除迭代器遍歷任何集合。無需MyList<T>MyVector<T>

0

MyCollection::begin應按照慣例返回MyCollection::iterator。因此MyVector::begin()應該返回至少 a MyCollection::iterator。不過,它可能是更多派生類型。

在你的情況下,MyVector::begin()返回一個MyVector::iterator,這不是從MyCollection::iterator派生。這就是它失敗的原因。