一、反向迭代器的定义
-
在容器中从尾元素向首元素反向移动的迭代器
-
对于反向迭代器,递增和递减的含义会颠倒过来
-
递增一个反向迭代器会移动到前一个元素
-
递减一个迭代器会移动到下一个元素
二、反向迭代器的实现
cpp
// 适配器 -- 复用
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中定义:
cpp
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
rbegin:
cpp
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
rend:
cpp
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}