C++ | 反向迭代器

news2024/11/24 3:57:10

目录

前言

一、基本框架

二、起始位置和结束位置

三、反向迭代器的自增与自减

四、反向迭代器的判断

五、list类的修改

 六、单独设计反向迭代器类的意义


前言

        反向迭代器实际上与我们前面的stack、queue、priority一样,都是适配器;我们可以通过正向迭代器构建出反向迭代器;

一、基本框架

        我们首先创建一个反向迭代器的头文件;我们将所有反向迭代器的代码放入这个文件中;

        前面我们也说过了,反向迭代器实际上是一种适配器,其实是对任意双向的正向迭代器的封装;因此有了以下代码;

namespace MySpace
{
    // Iterator为迭代器模板参数,Ref为数据的引用类型,Ptr为数据的指针类型
	template<class Iterator, class Ref, class Ptr>
	class __reverse_iterator
	{
	public:
		typedef __reverse_iterator<Iterator, Ref, Ptr> self;

		__reverse_iterator(Iterator it) 
			: _it(it)
		{}

	private:
		Iterator _it;
	};
}

二、起始位置和结束位置

        首先,我们要确定的是反向迭代器起始位置与结束位置,在list中,我们一般会想着将起始位置定位最后一个数据的位置,而结束位置为哨兵位头节点的位置;而在STL库中,为了追求对称之美,起始位置和结束位置如下图所示;

        这样定义的话,对于解引用,又出了一些问题,我们必须要对其--,也就是访问前一个位置的数据;因此,对于*的重载与->的重载,有了如下代码;


        Ref operator*() const
		{
            // 找到前一个位置的数据
			Iterator tmp(_it);
			--tmp;
            // 这里的*是在传入参数的那个迭代器实现的重载(即正向迭代器的*)
			return *tmp;
		}
		Ptr operator->() const
		{
			Iterator tmp(_it);
			--tmp;
            // 这里的->是在传入参数的那个迭代器实现的重载(即正向迭代器的->)
			return tmp->_data;
		}

三、反向迭代器的自增与自减

        反向迭代器的自增与自减我们可以分别调用正向迭代器的自减与自增来实现;即他加我减,他减我加;

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

四、反向迭代器的判断

        对于反向迭代器的判断,我们只需重载==与!=即可;我们也可以调用正向迭代器的==与!=来实现;

		bool operator==(const self& rit)
		{
			return _it == rit._it;
		}
		bool operator!=(const self& rit)
		{
			return _it != rit._it;
		}

五、list类的修改

        前面我们将反向迭代器的类实现了,这里我们还需要在list类中重定义反向迭代器名(统一接口名),以及添加相关接口(如rbegin、rend等)

		// 反向迭代器
		typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;
		typedef __reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;

		// 反向迭代器相关成员函数
		reverse_iterator rbegin()
		{
			return reverse_iterator(end());
		}
		const_reverse_iterator rbegin() const
		{
			return const_reverse_iterator(end());
		}
		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}
		const_reverse_iterator rend() const
		{
			return const_reverse_iterator(begin());
		}

        添加了如上代码后,我们的反向迭代器便可以运行了;

 六、单独设计反向迭代器类的意义

        可以看到,我们单独将反向迭代器放入一个单独的文件,也设计了一个单独的类,这有什么意义呢? 实际上,我们刚才设计的反向迭代器的接口也可以适用于vector等容器,我们仅仅只需要实现vector正向迭代器,我们便可通过这个反向迭代器对正向迭代器进行封装即可,仅仅在类中添加一些接口就可以适配上,因此我们实现的反向迭代器是一种适配器;关于list与vector的反向迭代器的源码,我放在了下面供大家参考;

vector反向迭代器

list反向迭代器

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国网技术学院MySQL课堂练习

一、数据库的安装和配置 在虚拟机中安装WINDOWS7操作系统 正常安装&#xff0c;查询安装教程即可安装必备组件和MYSQL5.7数据库 正常安装&#xff0c;查询安装教程即可修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可&#xff0c;作用为设置默认的内…

Hudi基础知识讲解

Hudi概述 Hudi是一种数据湖的存储格式&#xff0c;在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎&#xff0c;提供IUD接口&#xff0c;在 HDFS的数据集上提供了插入更新和增量拉取的流原语。 基础架构图 Hudi特性 ACID事务能…

将一个数组对象里的属性值全部追加到另外一个数组的对象里

介绍 将一个数组对象里的属性值全部追加到另外一个数组的对象里&#xff0c;这里需要使用到 map 遍历&#xff0c;循环数组&#xff0c;依次处理元素&#xff0c;实现重组数组对象 tips&#xff1a; map() 不会对空数组进行检测。 map() 不会改变原始数组。 Object.assign(),…

RocketMQ5.0消息存储<二>_消息存储流程

RocketMQ5.0消息存储<二>_消息存储流程 一、消息存储概览 如下图所示,是消息从生产者发送消息到消费者消费消息的大致流程。 step1:生产者发送消息到消息存储Broker端; step2:单一文件Commitlog存储所有主题消息,确保顺序写入,提高吞吐量; step3:消息通过堆外缓存,…

YOLOv5解析 | 第五篇:yolo.py文件解读

一、前言 文件位置:**./models/yolo.py** 这个文件是YOLOv5网络模型的搭建文件,如果你想改进YOLOv5,那么这么文件是你必须进行修改的文件之一。文件内容看起来多,其实真正有用的代码不多的,重点理解好我文中提到的一个函数两个类即可。 注:由于YOLOv5版本众多,同一个文件…

Nacos详解

Nacos详解 注册中心常见的注册中心ZookeeperEurekaConsulNacos Nacos 注册中心Docker安装&#xff1a;使用&#xff1a;1、引入 Maven&#xff1a;2、添加注解3、配置Nacos其他使用&#xff1a; Nacos 配置中心统一配置管理添加配置文件从微服务拉取配置依赖 Maven&#xff1a;…

工业大数据的来源是什么?有什么用?和工业互联网有关系么?

工业大数据的来源因特定行业和企业而不尽相同。常见的数据来源包括&#xff1a; 1.传感器数据&#xff1a;工业系统和设备通常配备传感器&#xff0c;用于收集温度、压力、湿度、振动等各种参数的数据。 2.机器生成的数据&#xff1a;包括机器和工业设备在运行过程中产生的数…

Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】

Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 一、Nacos-config配置中心1、官方文档 二、快速配置1、Nacos-config基本操作2、Nacos配置中心使用3、Nacos客户端 每10ms去 注册中心 进行判断 根据MD54、基于dataid 为yaml的文件扩展名方式5、支持自定义Group…

阿里云OSS使用(小白也看得懂)

oss简介 oss是对象存储服务&#xff08;Object Storage Service&#xff09;的缩写&#xff0c;是一种分布式存储服务&#xff0c;用于存储和访问大规模数据。它提供了可靠、安全、低成本的数据存储解决方案&#xff0c;可以通过网络随时随地访问存储的数据。oss常用于存储图片…

Vue中实现图片黏贴上传到服务器:功能分析和实现

主要的知识点是&#xff0c;浏览的paste事件&#xff0c;clipboardData。 paste 一个标准的Dom事件&#xff0c;粘贴事件&#xff0c;会在用户按下Ctrlv ,或者通过鼠标复制时触发.像其他事件一样&#xff0c;我们可以通过addEventListener为一个Element添加一个粘贴事件的监听…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

三个视频怎么合成一个视频?分享简单好用的合并方法

通过将多个视频合并成一个&#xff0c;可以将分散的内容整合在一起&#xff0c;形成一个连贯的故事或主题。这对于制作影片、剧集、纪录片或视频日志等需要综合多个片段的项目非常有用&#xff0c;可以产生更连贯和流畅的观看体验。那么怎么将视频进行合并呢&#xff1f;给大家…

维度建模中的缓慢变化维

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a; 类型1.在当前数据行更新当前值&#xff0c;只有最新状态&#xff1b; 类型2.拉链表&#xff0c;保留历史又有最新状态&#xff1b; 类型3.新增列&am…

腾讯云CVM云服务器实例族是什么?区别选择攻略

腾讯云服务器CVM有多种实例族&#xff0c;如标准型S6、标准型S5、SA3实例、高IO型、内存、计算型及GPU型实例等&#xff0c;如何选择云服务器CVM实例规格呢&#xff1f;腾讯云服务器网建议根据实际使用场景选择云服务器CVM规格&#xff0c;例如Web网站应用可以选择标准型S5或S6…

Pytorch实现warm up和consine decay

在深度学习领域&#xff0c;模型训练过程中的不稳定性是一个常见的问题。为了解决这个问题&#xff0c;在Resnet这篇论文也提及了Warm Up的方法&#xff0c;通过逐渐增加学习率&#xff0c;引导模型在训练初期更稳定地收敛。同时在warm up之后结合consine decay的方法让训练变得…

计讯物联网关型水利遥测终端机TY910确保闸站自动化监测长效运行

闸站是我国水利建设工程的重要组成部分&#xff0c;具备调度水源、防洪排涝、灌溉等能力&#xff0c;在农业、水路运输、养殖业等行业领域起着关键作用&#xff0c;进而解决区域水资源不均衡的问题&#xff0c;促进水资源多方面的利用。当前&#xff0c;我国闸站存在数量多、分…

SonarQube安装、汉化及使用

一、环境准备 SonarQube下载&#xff1a;https://www.sonarqube.org/downloads/Java 11 或以上版本安装 多环境共存&#xff0c;指定 SonarQube 的java运行版本&#xff08;注意地址改为自己的java路径&#xff0c;最后面必须带java&#xff09;&#xff1a; 解压目录下 &#…

Atlas 200I DK A2视频保存

Atlas 200I DK A2开发者套件内置案例第一个目标检测&#xff0c;视频保存下来无法打开&#xff0c;修改为cv2保存可正常在本地展示。 原代码部分 def infer_video(video_path, model, labels_dict, cfg, output_pathoutput.mp4):"""视频推理"""…

YOLOv5解析 | 第四篇:common.py文件详解

前言 文件位置:**./models/commonpy** 该文件是实现YOLO算法中各个模块的地方,如果我们需要修改某一模块(例如C3),那么就需要修改这个文件中对应模块的的定义。这里我先围绕代码,带大家过一遍各个模块的定义,详细介绍我将在后续的教案中逐步展开。由于YOLOv5版本问题,同…

SpringBoot 如何处理 CORS 跨域?

Springboot跨域问题&#xff0c;是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点 跨域只存在于浏览器端&#xff0c;不存在于安卓/ios/Node.js/python/ java等其它环境跨域请求能发出去&#xff0c;服务端能收到请求并正常返回结果&#xff0c;只是结果被浏览器…