迭代器适配器(iterator adapters)
迭代器适配器是迭代器应用于迭代器的产物,包括 insert iterator, reverse iterator 和 iostream iterator。迭代器适配器本质是对容器或一般迭代器进行封装,以使其更加符合需求。
reverse_iterator概述
reverse_iterator 可以将一般迭代器的行进方向进行逆转,使operator++ 进行后退操作,使 operator-- 进行前进操作。这种逆转行为运用在从尾部开始进行的算法上有很大方便性。借由 reverse_iterator,可以实现容器的反向迭代器,只需要对容器的正向迭代器进行封装即可。
reverse_iterator完整定义
//接收三个模板参数,第一个模板参数接受正向迭代器;第二、第三个模板参数接收
//引用类型和指针类型,以区别普通对象和const对象
template<typename iterator, typename Ref, typename Ptr>
class reverse_iterator
{
public:
typedef reverse_iterator<iterator, Ref, Ptr> self;
public:
//用正向迭代器进行构造
reverse_iterator(iterator it)
:current(it)
{ }
self& operator++()
{
--current; //保证行进操作的逆向
return *this;
}
self& operator--()
{
++current;
return *this;
}
self operator++(int)
{
self tmp = current;
--current;
return tmp;
}
self operator--(int)
{
self tmp = current;
++current;
return tmp;
}
bool operator==(const self& it)
{
return current == it.current;
}
bool operator!=(const self& it)
{
return current != it.current;
}
Ref operator*()
{
iterator tmp = current;
return *(--tmp);
}
Ptr operator->()
{
return &(operator*());
}
private:
iterator current; //是对正向迭代器的封装
};
正向迭代器与反向迭代器互为镜像关系,使用begin()对rend()进行构造,使用end()对rbegin()进行构造。一个reverse_iterator的使用情景为:
//借由正向迭代器和迭代器适配器实现链表的反向迭代器
typedef reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
reverse_iterator实现细节
因为正向迭代器与反向迭代器是互为镜像的,所以对反向迭代器进行解引用操作时要注意解引用的位置是在当前 rbegin() 实际位置的前一个位置:
当迭代器被逆转,虽然实体位置不变,但是逻辑位置必须如上图改变,故有了第三部分反向迭代器解引用的代码实现。