反向迭代器在实现上其实是复用了正向迭代器的代码,即利用正向迭代器进行适配,能适配的原因:有很多功能都是重合的,如 *,->,++,--等,正反迭代器唯一的区别就是方向相反。
如图
那么如何用正向迭代器进行适配呢?
定义模板
这个正向迭代器可以传任何容器,如 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());
}