我正在尝试为我的迭代器和const_iterator类实现一个反向迭代器适配器,但有点麻烦.如果有人能指导我完成这一点,那将非常感谢!
我的想法是我应该能够从我的rbegin()和rend()函数调用中创建一个反向迭代器
reverse_iterator rbegin(); reverse_iterator rend(); const_reverse_iterator rbegin() const; const_reverse_iterator rend() const;
我在课堂上使用以下typedef:
typedef btree_iterator<T> iterator; typedef const_btree_iterator<T> const_iterator; typedef reverse_btree_iterator<iterator> reverse_iterator; typedef reverse_btree_iterator<const_iterator> const_reverse_iterator;
如您所见,我希望能够使用模板创建反向迭代器,为reverse_iterator类提供迭代器或const_iterator.
不幸的是,有点我坚持……
下面是我目前拥有的类定义,但有错误.
template <typename I> class reverse_btree_iterator { typedef ptrdiff_t difference_type; typedef bidirectional_iterator_tag iterator_category; public: reverse_btree_iterator() : base_(I()) {} template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {} I base() { return base_; } I::reference operator*() const; I::pointer operator->() const; I& operator++(); I operator++(int); I& operator--(); I operator--(int); bool operator==(const I& other) const; bool operator!=(const I& other) const; private: I base_; };
我之前从未使用过这样的模板,所以很可能我完全误解了它们的使用方式……
由于我可以是迭代器或const_iterator,因此引用和指针的typedef在两个类之间有所不同.没有编译的行是这些:
I::reference operator*() const; I::pointer operator->() const;
如果我不能做I :: reference和I :: pointer,我不知道如何让一个reverse_iterator类对iterator和const_iterator都有效.我也尝试在前面添加模板,因为它们在迭代器类中定义(例如):
typedef T* pointer; typedef T& reference;
解决方法
引用和指针是从属名称,因此您必须使用
typename I::reference operator*() const; typename I::pointer operator->() const;
另外,构造函数应该只接受I.
但是,根本不需要编写这个类.标准库有reverse_iterator.或者,如果你对此不满意,那么还有Boost.ReverseIterator.
所需要的只是
typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const_iterator> const_reverse_iterator;