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