【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

文章目录

  • 前言
  • 一、反向迭代器封装(reverseiterator)
    • 1.构造函数
    • 1解引用操作.
    • 3.->运算符重载
    • 4.前置++,后置++
    • 5.前置--,后置--
    • 6.不等号运算符重载
    • 7.完整代码
  • 二、rbegin()以及rend()
    • 1.rbeign()
    • 2.rend()


前言

我们要写出一个通用的反向迭代器模拟而且在保证代码简介不繁琐的的情况下,一定程度上使用我们自己模拟的已经封装好的iterator迭代器可以简化许多步骤,首先我们要知道正向迭代器与反向迭代器在位置上的关系

在这里插入图片描述
在这里插入图片描述

一、反向迭代器封装(reverseiterator)

1.构造函数

Iterator _it;
		ReverseIterator(Iterator it)
		//iterator这里回头传的是正向迭代器
			:_it(it)
		{}

1解引用操作.

typedef ReverseIterator<Iterator, Ref, Ptr> self;
		Ref operator*() {
			Iterator tmp(_it);
			//因为从end()位置开始,所以要先--,
			//获得新的位置,但不改变原来的_it
			//所以建立一个临时对象对其进行--操作
			return *(--tmo);
		}

3.->运算符重载

Ptr operator->() {
			return &( operator*());
		}

4.前置++,后置++

self& operator++() {
			--_it;
			//举例:从rbegin位置开始,也就是end()位置
			//因为此时的位置无效要前一个位置才有效,所以先前置--
			//反向迭代器的++就是正向迭代器的--
			return *this;
		}
		self operator++(int) {
			self tmp(*this);
			--_it;
			return tmp;
		}

5.前置–,后置–

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

6.不等号运算符重载

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

7.完整代码

namespace simulation {
	template<class Iterator ,class Ref,class Ptr>
	//相当于:
	//typedef ReverseIterator<iterator, T&, T*> reverseiterator;
	//typedef ReverseIterator<const_iterator, const T&, const T*> const_reverseiterator;
	struct ReverseIterator {
		Iterator _it;
		ReverseIterator(Iterator it)
			:_it(it)
		{}
		typedef ReverseIterator<Iterator, Ref, Ptr> self;
		Ref operator*() {
			Iterator tmp(_it);
			//因为从end()位置开始,所以要先--,
			//获得新的位置,但不改变原来的_it
			//所以建立一个临时对象对其进行--操作
			return *(--tmo);
		}

		self& operator++() {
			--_it;
			//举例:从rbegin位置开始,也就是end()位置
			//因为此时的位置无效要前一个位置才有效,所以先前置--
			//反向迭代器的++就是正向迭代器的--
			return *this;
		}
		self operator++(int) {
			self tmp(*this);
			--_it;
			return tmp;
		}

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

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

	};
}

二、rbegin()以及rend()

//先在vctor或者list的头文件中进行重定义
typedef ReverseIterator<iterator, T&, T*> reverseiterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverseiterator;

1.rbeign()

reverseiterator rbegin() {
			//反向迭代器的开头对正向迭代器末尾进行操作
			return reverseiterator(end());
		}
		const_reverseiterator rbegin()const {
			return const_reverseiterator(end());
		}

2.rend()

reverseiterator rend() {
			return reverseiterator(begin());
		}
		const_reverseiterator rend()const {
			return const_reverseiterator(begin());
		}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ADSelfService Plus:保护密码安全的最佳解决方案

密码安全是当今数字时代中至关重要的话题。随着互联网和信息技术的迅速发展&#xff0c;我们的生活变得越来越数字化&#xff0c;密码已成为我们生活中不可或缺的一部分。然而&#xff0c;随着各种网络威胁和黑客攻击不断增加&#xff0c;保护我们的密码变得越来越重要。 密码安…

linux基础学习

1.day1 1、修改虚拟机的网络&#xff1b; sudo vim /etc/netplan/*.yaml sudo netplan apply 2.day2 1、VIM配置&#xff1b; 2、安装SSH&#xff0c;调用putty接入终端&#xff1b; 3、shell命令&#xff1b; *&#xff1a;匹配任意长度的字符 &#xff1f;&#xff1a;匹…

为什么VPS是中小型企业的理想选择?

对于中小型企业来说&#xff0c;选择适合自身业务需求的托管方案至关重要。在如今数字化时代&#xff0c;VPS作为一种灵活、高性能的托管解决方案&#xff0c;成为中小型企业的理想选择。作为动态VPS代理产品供应商&#xff0c;我们深知一个高质量、高性能的VPS托管服务&#x…

使用IDEA打jar包的详细图文教程

1. 点击intellij idea左上角的“File”菜单 -> Project Structure 2. 点击"Artifacts" -> 绿色的"" -> “JAR” -> Empty 3. Name栏填入自定义的名字&#xff0c;Output ditectory 选择 jar 包目标目录&#xff0c;Available Elements 里右击…

信息安全:网络安全体系 与 网络安全模型.

信息安全&#xff1a;网络安全体系 与 网络安全模型. 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略、多种技术、管理方法和人员安全素质的综合。一般而言&#xff0c;网络安全体系是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…

12-3_Qt 5.9 C++开发指南_创建和使用静态链接库

第12章中的静态链接库和动态链接库介绍&#xff0c;都是以UI操作的方式进行&#xff0c;真正在实践中&#xff0c;可以参考UI操作产生的代码来实现同样的功能。 文章目录 1. 创建静态链接库1.1 创建静态链接库过程1.2 静态链接库代码1.2.1 静态链接库可视化UI设计框架1.2.2 qw…

关于element ui 安装失败的问题解决方法、查看是否安装成功及如何引入

Vue2引入 执行npm i element-ui -S报错 原因&#xff1a;npm版本太高 报错信息&#xff1a; 解决办法&#xff1a; 使用命令&#xff1a; npm install --legacy-peer-deps element-ui --save 引入&#xff1a; 在main.js文件中引入 //引入Vue import Vue from vue; //引入…

二阶阻尼弹簧系统的simulink仿真(s函数)

文章目录 前言一.非线性反步法1.原系统对应的s函数脚本文件&#xff08;仅修改模板的初始化函数、导数函数和输出函数三个部分&#xff09;2.控制器对应的s函数脚本文件&#xff08;仅修改模板的初始化函数和输出函数两个部分&#xff09;3.其他参数脚本文件4.输入5.输出&#…

成功拿下25K测试岗,原来字节真的很好进

朋友&#xff0c;作为一个曾经从机械转行到IT的行业的过来人&#xff0c;已在IT行业工作4年&#xff0c;分享一下我的经验&#xff0c;供你参考。 讲真&#xff0c;现在想通过培训班培训几个月就进入IT行业&#xff0c;越来越来难了&#xff1b;如果是在2018年以前&#xff0c;…

MyBatis缓存-提高检索效率的利器--一级缓存

&#x1f600;前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家…

Python入门【__init__ 构造方法和 __new__ 方法、类对象、类属性、类方法、静态方法、内存分析实例对象和类对象创建过程(重要)】(十四)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…

[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim

文章目录 1. containerd安装2. 源码编译3. 验证编译的二进制文件是否含有调试需要的信息3.1. objdump工具验证3.2. file工具验证3.3. dlv工具验证 4. debug 1. containerd安装 [Ubuntu 22.04] 安装containerd 2. 源码编译 主要步骤如下&#xff1a; 1、从github下载containe…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 选择排序的步骤&#xff1a; 1>首先在未排序序列中找到最小&#xff08;大&#xff09;元素…

pytorch深度学习快速入门

放弃个人素质 享受缺德人生 拒绝精神内耗 有事直接发疯 一、安装Anaconda 官网下载地址 选择适合的系统版本进行安装即可 安装完之后&#xff0c;可以看到下面的内容 二、使用Anaconda创建开发环境 这也是为什么要使用Anaconda的原因&#xff0c;可以创建不同的开发环境&am…

【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

微信小程序 居中、居右、居底和横向、纵向布局,文字在图片中间,网格布局

微信小程序居中、居右、横纵布局 1、水平垂直居中&#xff08;相对父类控件&#xff09;方式一&#xff1a;水平垂直居中 父类控件&#xff1a; display: flex;align-items: center;//子控件垂直居中justify-content: center;//子控件水平居中width: 100%;height: 400px //注意…

Golang Devops项目开发(1)

1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档&#xff1a;《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收&#xff0c;再也不需要开发人员管理内存 b. 开发人员专注业务实现&#xff0c;降低了心智负担 c. 只需要new分配内存&#xff0c;…

码力全开!请查收HDC.Together 2023亮点日程

<主题演讲> <技术交流与互动> <妙趣之旅> 点击关注阅读原文&#xff0c;了解更多资讯