当前位置: 首页 > article >正文

反向迭代器

反向迭代器其实就是对正向迭代器的一个封装实现。那么可以说反向迭代器也是一个适配器,本文模拟实现List中的反向迭代器,具体源码我已更新至gitee中的List,有需要的读者可自信参考,如果细节错误多谢指出。

template<typename T, typename Ref, typename Ptr>
	struct _list_iterator {

		typedef list_node<T> node;
		typedef _list_iterator<T, Ref, Ptr> self;
		node* _node;
		//Ref代表T&  or  const T&,Ptr代表T*  or  const T*
		_list_iterator(node* n)
			:_node(n)
		{}

		Ref operator * () {
			return _node->_data;
		}

		Ptr operator ->() {
			return &_node->_data;
		}

		self& operator ++ () {
			_node = _node->_next;
			return *this;
		}

		self operator ++(int) {
			self tmp = *this;
			_node = _node->_next;
			return tmp;			//后置不能返回引用
		}

		self& operator --() {
			_node = _node->_prev;
			return *this;
		}

		self operator --(int) {
			self tmp = *this;
			_node = _node->_prev;
			return tmp;
		}

		bool operator ==(const self& s)const  {
			return _node == s._node;
		}

		bool operator !=(const self& s) const {
			return !(_node == s._node);
		}
	};

这是我们之前模拟实现过的正向迭代器,可以复习一下
实现反向迭代器是方式有很多种,最简单最容易想到的一种就是完全复刻正向迭代器的样子,将_prev / _next互换即可,这样做的确可以,运行效率也ok,但是显得代码非常重复冗余

因此,我们可以这样想,不管什么迭代器,它无非是原生指针或是对原生指针的封装,反向迭代器亦是如此,那么对原生指针的封装再进行封装,底层依旧是原生指针,但可以简化代码,故而我们采用对正向迭代器进行进一步封装来实现反向迭代器

下面我们就来实现一个List的反向迭代器

template<typename Iterator,typename Ref,typename Ptr>
struct _list_reverse_iterator{
	iterator _it;	//成员属性
	typedef _list_reverse_ierator<Iterator,Ref,Ptr> self;
	
	_list_reverse_iterator(Iterator& v)   //此处gitee忘写&
		:_it(v);
	{}

	Ref operator * () {
			Iterator tmp = _it;
			return *(--tmp);
	}
		
	bool operator == (const self& v)const{
		return v._it==_it;
	}

	self& operator++(){
		--_it;
		return *this;
	}

	self operator--(int){
		self tmp = *this;
		++_it;
		return tmp;
	}

	//…………………………………………
}

为了追求对称性,标准库中的反向迭代器rbegin指向的位置是正向迭代器的end位置,rend指向begin位置,我们也这么做,当然你也可以不这么做

这样一来,就极大得体现了复用的思想,其实这样实现的方向迭代器还有一个极大的优势,就是这种写法适用于任何双向迭代器,恰恰突显出了C++中一直强调的泛型编程。


http://www.kler.cn/a/231911.html

相关文章:

  • 详细分析ip addr show 查看网络配置的命令
  • 哈希表学习分享
  • 27.<Spring博客系统③(实现用户退出登录接口+发布博客+删除/编辑博客)>
  • IC 脚本之VIM 记录
  • 【动手学电机驱动】 STM32-FOC(7)MCSDK Pilot 上位机控制与调试
  • 如何知道表之间的关系(为了知识图谱的构建)
  • SQL Parser
  • JavaScript流程控制详解之循环结构(倒三角、九九乘法表)
  • C语言:矩阵中的最小元素
  • On the Spectral Bias of Neural Networks论文阅读
  • Docker-Learn(一)使用Dockerfile创建Docker镜像
  • Windows SDK(四)鼠标和键盘消息处理
  • 已解决:tpm2_createpriimay: command not found
  • 相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化
  • pytorch入门第一天
  • 【Spring连载】使用Spring Data访问Redis(九)----Redis流 Streams
  • 打卡今天学习的命令 (linux
  • 深度学习本科课程 实验3 网络优化
  • Terraform实战(三)-在AWS上尝试Terraform的Vault Provider
  • Golang 并发 Cond条件变量
  • TS学习与实践
  • freertos 源码分析五 任务调度一
  • Linux大集合
  • 使用python实现:判断任意坐标点在STL几何模型的内部或外部
  • go 内存二进制数据操作
  • Redis——缓存设计与优化