我想用自己的迭代器编写围绕std::list
和std::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
,但我不知道什么是正确的返回类型应该是。
我试图做甚至可能吗?目前我的代码组织完全有可能是完全错误的。这正是我所尝试过的。我的目标是获得它,以便上面的示例驱动程序代码可以工作,因此答案可能涉及代码的全面重组。我真的只是在寻找建议。我不需要一个完整的答案。
为什么你需要标准模板的超类?以前从未见过。 – 2013-03-18 17:47:46
@BoPersson,这是一个家庭作业。我不想找到问题的答案。只是一些指导。 – Daniel 2013-03-18 17:48:18
一个问题是'std :: list :: iterator'是一个'BidirectionalIterator',而'std :: vector :: iterator'是一个'RandomAccessIterator'。你可以做的最好的做法是使'MyCollection :: iterator'具有'BidirectionalIterator'的功能(看作'RandomAccessIterator'需要'BidirectionalIterator')。你不能使它具有'RandomAccessIterator'所具有的功能,因为这对于'std :: list :: iterator'完全不起作用。 – Cornstalks 2013-03-18 18:09:19