反相迭代器

本文之中我们将对反向迭代器进行简要的叙述。

之前在讲解链表的时候我们讲述了在stl链表这个容器中使用的是如下图所示的三个模板参数:

这样就解决了如果需要已经写好了普通迭代器,然后需要编写const迭代器代码冗余的问题。那在这里就会想到,那么反向迭代器与正向迭代器的原理是类似的,那么我们同样可以使用三个模板参数来在list中构建一个反向迭代器。通过查看list的源码,我们发现实际上在其中并没有直接写出反向迭代器的代码,而是使用了一种类模板的结构生成了反向迭代器:

下面我们就来简单的来实现这个反向迭代器:

上面是原代码中的一些内容,可以看到反向迭代器的rebegin()就是正向迭代器的end(),反向的++就是正向的--,但是有一点不同的就是解引用,在解引用中解引用的不是当前值,而是当前位置的前一个位置。

 

这就是rebegin与end的对应,在源码中为了让代码看上去更加的整齐就是使用了上述解引用的方法。在rebegin = end的时候,通过解引用访问前一个位置的迭代器数据,当rbegin到达1的时候就访问结束了。知道了这些问题就可以来简要的编写一个反向迭代器。

#pragma once

template<class Iterator, class Ref, class Ptr>
class Reverse_Iterator
{
public:

	typedef Reverse_Iterator<Iterator, Ref, Ptr> Self;

	Reverse_Iterator(Iterator it)
		:_cur(it)
	{}

	Ref operator*() // 为了对称需要返回前一个的位置
	{
		Iterator tmp = _cur;
		--tmp;
		return *tmp;
	}

	Self& operator++()
	{
		--_cur;
		return *this;
	}

	Self operator++(int)
	{
		Iterator tmp(*this);;
		--_cur;
		return tmp;
	}

	Self& operator--()
	{
		++_cur;
		return *this;
	}

	Self operator--(int)
	{
		Iterator tmp(*this);;
		++_cur;
		return tmp;
	}

	bool operator!=(const Self& s)
	{
		return _cur != s._cur;
	}

private:
	Iterator _cur;
};

反向迭代器的优势就在于,当我们写完了之后不仅仅是list这个容器可以使用,而且其余所有需要反向迭代器的容器都可以使用例如vector等,这样就可以提供了很多的便捷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值