reverse_iterator反向迭代器的实现

看似简单的东西,其实复杂。

看似复杂的东西,其实简单。


什么。是反向迭代器?顾名思义,对数据的反方向遍历,与正向迭代器做的事情相同,运动行为相反。

reverse_iterator反向迭代器的实现_第1张图片 list正向迭代器运行轨迹

 

 我们的利用迭代器遍历我的list是都是从(1)遍历的(5)最后it指向head,结束遍历。

而反向迭代器是不同的遍历顺序。

reverse_iterator反向迭代器的实现_第2张图片

反向迭代器遍历反向是由数据(5)遍历到(1)的。(不一定rit指向head是结束)

如果重新写list反向迭代器,是没有必要的,我们会发现我们的反向迭代器行为是与正向相反的

我们可以将指向迭代器进行复用,实现反向迭代器。

		self&operator++()
		{
			_it--;//反向迭代器的++就是正向迭代器的--
			return *this;
		}

		self& operator--()
		{
			_it++;//反向迭代器的--就是正向迭代器的++
			return *this;
		}

reverse_iterator反向迭代器的实现_第3张图片

根据我们的认为下(我真的是只有认为)rend()、end()、begin()、rbegin(),是这样的指向设计。

但是大佬喜欢对称。

reverse_iterator反向迭代器的实现_第4张图片

 将我们的反向迭代器指向改成了这样,那么我们的访问数据这是个问题。

  reference operator*() const {
    return *_it;
  }//错误的访问!!!!!

 所以大佬对我们的解引用运算符重载做了特殊处理

reverse_iterator反向迭代器的实现_第5张图片

 所以我们需要处理解引用操作

  reference operator*() {
    Iterator tmp = it;
    return *(--tmp);//解引用不移动指针,所以创建新对象,新对象移动解引用
  }

 只要是允许双向迭代器(bidirectional iterator)都是这样使用反向迭代器的。

你可能感兴趣的:(数据结构)