看似简单的东西,其实复杂。
看似复杂的东西,其实简单。
什么。是反向迭代器?顾名思义,对数据的反方向遍历,与正向迭代器做的事情相同,运动行为相反。

我们的利用迭代器遍历我的list是都是从(1)遍历的(5)最后it指向head,结束遍历。
而反向迭代器是不同的遍历顺序。
反向迭代器遍历反向是由数据(5)遍历到(1)的。(不一定rit指向head是结束)
如果重新写list反向迭代器,是没有必要的,我们会发现我们的反向迭代器行为是与正向相反的
我们可以将指向迭代器进行复用,实现反向迭代器。
self&operator++()
{
_it--;//反向迭代器的++就是正向迭代器的--
return *this;
}
self& operator--()
{
_it++;//反向迭代器的--就是正向迭代器的++
return *this;
}
根据我们的认为下(我真的是只有认为)rend()、end()、begin()、rbegin(),是这样的指向设计。
但是大佬喜欢对称。
将我们的反向迭代器指向改成了这样,那么我们的访问数据这是个问题。
reference operator*() const {
return *_it;
}//错误的访问!!!!!
所以大佬对我们的解引用运算符重载做了特殊处理
所以我们需要处理解引用操作
reference operator*() {
Iterator tmp = it;
return *(--tmp);//解引用不移动指针,所以创建新对象,新对象移动解引用
}
只要是允许双向迭代器(bidirectional iterator)都是这样使用反向迭代器的。