介绍
反向迭代器 reverse_iterator
可以用来反向遍历容器,
反向迭代器类中需要有:正向迭代器对象
、构造函数
==注意==:源码中的反向迭代器设计较为复杂,涉及 萃取 等操作,为了方便学习,这里实现的是简易版本
库中的反向迭代器中,rbegin()
指向最后一个有效元素的下一个位置,rend()
指向第一个有效元素
代码实现
// 反向迭代器
template<class iterator, class Ref, class Ptr> // iterator 是正向迭代器
class ReverseIterator
{
typedef ReverseIterator<iterator, Ref, Ptr> Self;
public:
ReverseIterator(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;
}
private:
iterator _it;
};
在vector、list 中加上rbengin和rend 是一样的
typedef ReverseIterator< iterator, T&, T* > reverse_iterator;
typedef ReverseIterator< const_iterator, const T&, const T* > const_reverse_iterator;
reverse_iterator rbegin()
{
return reverse_iterator(end()); // 传的是正向迭代器的end()
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}