目录
一、基本介绍
二、模拟实现
2.1 - operator*
2.2 - vector 和 list 的反向迭代器
一、基本介绍
反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历。
反向迭代器底层只能选择双向迭代器或者随机访问迭代器作为其基础迭代器,通过对 ++ 和 -- 运算符进行重载,使得:
-
当反向迭代器进行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器。
-
当反向迭代器进行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。
反向迭代器以类模板的形式定义在 <iterator> 头文件中,并位于 std
命名空间中。
template <class Iterator> class reverse_iterator;
二、模拟实现
#pragma once
namespace yzz
{
template<class Iterator, class Ref, class Ptr>
class reverse_iterator
{
typedef reverse_iterator<Iterator, Ref, Ptr> self;
public:
reverse_iterator()
{ }
reverse_iterator(Iterator it) : _it(it)
{ }
reverse_iterator(const self& rit) : _it(rit._it)
{ }
Iterator base() const
{
return _it;
}
Ref operator*() const
{
Iterator tmp = _it;
return *--tmp;
}
Ptr operator->() const
{
return &(operator*());
}
self& operator++()
{
--_it;
return *this;
}
self operator++(int)
{
self tmp = *this;
--_it;
return tmp;
}
self& operator--()
{
++_it;
return *this;
}
self operator--(int)
{
self tmp = *this;
++_it;
return tmp;
}
bool operator==(const self& rit) const
{
return _it == rit._rit;
}
bool operator!=(const self& rit) const
{
return _it != rit._it;
}
private:
Iterator _it;
};
}
2.1 - operator*
通过对源码的剖析,我们可以发现 vector 容器和 list 容器的成员函数 rebegin
以及 rend
的实现是一样的,即:
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
所以在重载反向迭代器的解引用运算符 * 时,不能直接返回,即 return *_it;
,而应该是 Iterator tmp = _it; return *--tmp;
。
2.2 - vector 和 list 的反向迭代器
vector 和 list 的反向迭代器实现也是一样的,即:
typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
typedef reverse_iterator<iterator, T&, T*> reverse_iterator;