一、反向迭代器的定义
-
在容器中从尾元素向首元素反向移动的迭代器
-
对于反向迭代器,递增和递减的含义会颠倒过来
-
递增一个反向迭代器会移动到前一个元素
-
递减一个迭代器会移动到下一个元素
二、反向迭代器的实现
// 适配器 -- 复用
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Iterator _it;Reverse_iterator(Iterator it):_it(it){}Ref operator*(){Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return &(operator*());}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator==(const Self& s){return _it == s._it;}bool operator!=(const Self& s){return _it != s._it;}
};
在实现时。我们实际是复用iterator,来实现Reverse_iterator。
所以在构造函数中,我们直接使用iterator对反向迭代器进行初始化。
在解引用操作时,因为从end()位置开始,所以要先--,获得新的位置,但不改变原来的_it ,所以建立一个临时对象对其进行--操作。
三、rbegin以及rend
为了实现rbegin或者rend,我们首先要在list或者vector中定义:
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
rbegin:
reverse_iterator rbegin()
{return reverse_iterator(end());
}const_reverse_iterator rbegin() const
{return const_reverse_iterator(end());
}
rend:
reverse_iterator rend()
{return reverse_iterator(begin());
}const_reverse_iterator rend() const
{return const_reverse_iterator(begin());
}