C++反向迭代器

C++反向迭代器

在这里插入图片描述

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容介绍反向迭代器的概念和模拟实现一个通用的反向迭代器

1.反向迭代器的概念

我们通过学习stl库我们了解到迭代器分为正向迭代器和反向迭代器。正向迭代器适用于正向遍历该数据类型的中的所有元素。

所以反向的迭代器顾名思义,就是反向遍历该数据类型中的所有元素。

接下来我将详细讲解如何自己实现一个反向迭代器。

2.反向迭代器的模拟实现

反向迭代器的实现思路有两个:

  • 通过对正向迭代器的代码进行修改实现。
  • 采用适配器的写法原理将正向迭代器作为一个模板参数来实现。

对于上述两个方法来说:

​ 第一种方法只适用于对应类型的正向迭代器,而第二种的实现方式可以实现一个通用的模板适用于所有的正向迭代器是双向迭代器的类型,因此我们接下来用第二种方法来实现反向迭代器。

以下是源代码:

//iterator.h
#pragma once

namespace xupt
{
	 //这里我们采用将正向迭代器作为一个模板参数
	  template<class Iterator,class Ref, class Ptr>
	  struct Reverse_Iterator
	  {
		  Iterator _cur;
		  typedef Reverse_Iterator<Iterator, Ref, Ptr> Self;

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

		  Ref operator*()
		  {
			  Iterator tmp = _cur;
			  --tmp;
			  return *tmp;
		  }
			//反向迭代器的++就是正向迭代器的--
		  Self& operator++()
		  {
			  --_cur;
			  return *this;
		  }

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

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

	  };



};


//list.h
	template<class T> 
	struct list
	{
		typedef list_node<T> node;
		
	public:
		typedef _list_iterator<T, T&, T*> iterator;
		typedef _list_iterator<T, const T&, const T*> const_iterator;
		typedef Reverse_Iterator<iterator, T&, T*> reverse_iterator;
		typedef Reverse_Iterator<iterator, const T&, const T*> const_reverse_iterator;


		reverse_iterator rbegin()
		{
			return reverse_iterator(end());
		}
		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}
		const_reverse_iterator rbegin() const
		{
			return const_reverse_iterator(end());
		}
		const_reverse_iterator rend() const
		{
			return const_reverse_iterator(begin());
		}


		iterator begin()
		{
			return iterator(_head->_next);
		}
		iterator end()
		{
			return iterator(_head);
		}
		const_iterator begin() const
		{
			return const_iterator(_head->_next);
		}
		const_iterator end() const
		{
			return const_iterator(_head);
		}

【注意】

​ 这里我们看到解引用操作符的重载实现方式如下:

Ref operator*()
{
	Iterator tmp = _cur;
	--tmp;
	return *tmp;
}

为什么这里是先进行了–再进行解引用呢?

如下如所示我们可以看到因为我们采用的是rbegin对应end,rend对应begin的方法。所以我们当前迭代器指向的元素并不是我们实际想解引用的元素。

所以我们先进行了--操作才进行解引用,这样就可以得到我们想得到的元素内容了!

image-20230528163624973

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米睡不醒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值