除了stack和queue,基本上每一个容器都有正向迭代器,而正向迭代器和反向迭代只有++、--操作时才有区别,所以反向迭代器是正向迭代器的容器适配器
rbegin()和rend()
理论上来说rbegin和rend的指向应该如上图所示 ,但实际上为让反向迭代器和正向迭代器有对称性,源代码中反向迭代器的操作是rbegin()=begin(),rend()=end(),在重载解引用运算符的时候返回begin()和end()指向的前一个迭代器。
namespace ldx
{
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)
{}
//*it
Ref operator*()
{
Iterator tmp = _it;
tmp--;
return *tmp;
}
Ptr operator->()
{
return &operator*();
}
bool operator!=(const Self& rit)const
{
return _it != rit._it;
}
bool operator==(const Self& rit)const
{
return _it == rit._it;
}
Self& operator++()
{
_it--;
return *this;
}
Self& operator--()
{
_it++;
return *this;
}
Self& operator++(int)
{
Self temp = *this;
_it--;
return temp;
}
Self& operator--(int)
{
Self temp = *this;
_it++;
return temp;
}
};
}
//list.h
typedef Reverse_iterator<iterator, T&, T*>reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*>const_reverse_iterator;
reverse_iterator rbegin()
{
return reverse_iterator(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());
}