反向迭代器在实现上其实是复用了正向迭代器的代码,即利用正向迭代器进行适配,能适配的原因:有很多功能都是重合的,如 *,->,++,--等,正反迭代器唯一的区别就是方向相反。
如图
那么如何用正向迭代器进行适配呢?
定义模板
这个正向迭代器可以传任何容器,如 vector、list等
反向迭代器的各种接口可以直接或间接复用正向迭代器 _it 的,Iterator 是传过来的容器模板类型,_it 是实例化的正向迭代器对象
以list举例:在list 中typedef 重命名为 reverse_iterator,同一命名。
正向迭代器和反向迭代器的恰好对称再加上解引用时的 “先 - - ,再解引用”,恰好完美符合正向和反向迭代遍历!
迭代器内部代码:
template<class Iterator, class Ref, class Ptr> class Reverse_Iterator { public: typedef Reverse_Iterator<Iterator, Ref, Ptr> self; Reverse_Iterator(Iterator it) :_it(it) {} self& operator++() { --_it; return *this; } self& operator--() { ++_it; return *this; } Ref operator*() { Iterator tmp = _it; return *(--tmp); } Ptr operator->() { return &(operator*()); } bool operator!=(const self& it) { return _it != it._it; } private: Iterator _it; };
list中需要额外添加的代码来调用迭代器:
typedef Reverse_Iterator<iterator, T&, T*> reverse_iterator; reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator的迭代器也是复用普通迭代器,只需要在list中添加如下代码来调用:
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator; const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }