C++:关于反向迭代器的学习分享

news2024/9/22 19:20:05

前言:

        小编仅是一位初学者,所以对于C++的理解有限,文章大概率会出现表达不清楚可能也只是因为小编不知道如何更好表达,本文章仅作为一个学习的总结分享。

反向迭代器的概念

        反向迭代器故名思意解释反向的迭代器,与正向迭代器相反。正向迭代器的遍历是从前往后进行遍历,那么反向迭代器则是从后往前进行遍历。

        以下是对于反向迭代器的官方解释。

        反向迭代器是一个类模板,这个类反转了双向迭代器随机访问迭代器遍历范围的方向。

        内部保持了原始迭代器(即基迭代器)的一个副本,并用来反映在 reverse_iterator 上执行的操作:每当 reverse_iterator 被递增时,它的基迭代器会被递减,反之亦然。可以随时通过调用成员函数 base 获得具有当前状态的基迭代器的副本。

        可以看到反向迭代器的类模板参数是一个正向迭代器,那么就说明,只要容器支持正向迭代器就可以通过传入的正向迭代器取复用反向迭代器。那么这么做的好处就是并不需要每个支持正向迭代器的容器都要自己去写一份反向迭代器,而是直接复用反向迭代器的类模板,让编译器自身去实例化出相应的反向迭代器。

        随机访问迭代器:

                随机访问迭代器就是支持迭代器的+,-,++,--以及operator[ ]的操作,支持随机访问迭代器的容器有vector,string。他们的特点为是地址都是连续的一片地址空间。

        双向迭代器:

                双向迭代器就是仅支持迭代器的++,--操作,不支持+,-以及operator[ ],如list。因为list并不是一段连续的地址空间。

         那么在使用反向迭代器的时候会发现反向迭代器是通过++,来访问上一个容器的数据。

        反向迭代器的begin位置对应容器的end位置,反向迭代器的end位置对应容器的begin位置,为了方便理解,下图是一个list的begin位置以及end位置,那么相对于的就是list的反向迭代器的rbegin位置以及rend位置。

 

反向迭代器的实现

        为了方便理解,小编简单实现了一个反向迭代器。

	template<class Iterator ,class Ref ,class Ptr>
	struct Reverse_iterator
	{
		Iterator _it;
		Reverse_iterator(const Iterator& it)
			:_it(it)
		{}

		typedef Reverse_iterator<Iterator,Ref, Ptr> self;

		
		Ref operator*()
		{
			Iterator temp = _it;
			return *(--temp);
		}

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

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

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

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

	};

        小编的反向迭代器的类模板参数有三个:1.Iterator,2.Ref,3.Ptr。看过上期小编文章可以知道,Ref就是对模板参数T类型的引用,Pter就是模板参数T类型的指针。

        反向迭代器里只有一个成员变量,这个成员变量就是一个正向迭代器的对象。那么反向迭代器的初始化其实就是通过传入的正向迭代器的参数对反向迭代器里的it进行初始化。

        

        函数 Ref operator*()其实就==T&operator*(),访问的是容器里的数据。

        函数里的操作是创建一个新的正向迭代器值,并把_it赋值给temp。接着先--temp,在解引用temp。那么这里是经历了什么操作呢?

        不要忘记,反向迭代器其实是对容器的正向迭代器进行的再一次封装,必定是先有正向迭代器才会有反向迭代器。所以这里--temp操作会去调用正向迭代器的operator--。如果正向迭代器里没有那么就会报错。

        下图我将拿上期文章实现的list来举例。

        先对反向迭代器进行typedef,接着创建list的rbgin与rend函数,可以看到rbegin与rend都是去调用正向迭代器的begin与end。

        通过上图就说明了为什么函数 Ref operator*( )中,为什么temp需要先--在解引用。temp迭代器的--会调用正向迭代器的operator--,而*temp则会调用正向迭代器的operator*( )。

        

        那么反向迭代器的operator++()与 operator--()函数会调用正向迭代器的operator--()与operator++(),并且内部都是对正向迭代器的函数复用操作。唯一特殊的就是解引用。      

        

反向迭代器的好处是什么

        反向迭代器允许从容器的末尾向开头遍历元素。这对于一些算法或操作是非常方便的。

        1.逆序输出:你可能想要从容器的最后一个元素开始打印,反向迭代器使得这一过程非常简单如list的逆序打印,相对比起C语言,简单不要太多。

        2.从后向前的查找:在某些情况下,查找可能从容器的末尾开始是更高效的。

        3.因为反向迭代器是一个类模板,所以可以兼容任何有正向迭代器的容器。

                        

                                                             ————那么本片文章就到这里,感谢各位观众老爷观看。

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

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

相关文章

地铁X光危险品检测数据集

地铁X光危险品检测数据集介绍 数据集概览 本数据集旨在为地铁X光安检系统提供高质量的危险品检测训练素材。数据集包含18类常见危险品&#xff0c;总共6265张图像&#xff0c;每张图像均经过精心标注&#xff0c;确保了数据的质量和一致性。数据集适用于多种格式&#xff08;Y…

Spring优缺点和SpringBoot基础和搭建

前言 Spring框架是一个流行的Java企业级开发框架&#xff0c;旨在简化应用程序开发。它的核心特性包括依赖注入和面向切面编程&#xff0c;提供了灵活性和强大的社区支持。然而&#xff0c;Spring也存在学习曲线陡峭和配置复杂等缺点。 Spring Boot是基于Spring的项目&#x…

2024年高教社杯数学建模竞赛须知——三大注意事项

为了让大家在最后一天更好的备注国赛&#xff0c;我们今日将结合2024年国赛的新规给大家讲解国赛中三大主要的事项&#xff1a; 论文模版问题——国赛乃至大部分数模竞赛从来没有给出任何的论文模版&#xff0c;大部分的模版均为一次又一次学生、老师内部传播形成。资料使用问…

文件包含PHP伪协议利用方法

首先我们需要把配置文件php.ini 在 php.ini ⾥有两个重要的参数 allow_url_fopen 、allow_url_include&#xff1b; allow_url_fopen:默认值是 ON。允许 url ⾥的封装协议访问⽂件&#xff1b; allow_url_include:默认值是 OFF。不允许包含 url ⾥的封装协议包含⽂件&#x…

深度学习-VGG16原理和代码详解

VGG16 原理和代码详解 VGG16 是由牛津大学的 Visual Geometry Group (VGG) 提出的深度卷积神经网络&#xff0c;发表于 2014 年的论文 “Very Deep Convolutional Networks for Large-Scale Image Recognition”。VGG16 是其中的一种结构&#xff0c;由 16 层网络组成&#xf…

win系统安装mysql,使用mysqldump,pycharm使用mysqldump,避坑

文章目录 下载mysql的win客户端设置系统环境变量验证是否可用pycharm使用mysqldump异常问题排查 下载mysql的win客户端 官网下载地址如果下载旧版本&#xff0c;需自行到Archives里面找 本人使用的是mysql5.7&#xff0c;找到相应版本后&#xff0c;点击Download下载 设置系统…

Docker入门笔记

Docker 文章目录 Docker1. 下载 &#xff08;centos&#xff09;2. 部署 MySQL3. 常用命令4. 数据卷5. 自定义镜像6. Java 项目部署 1. 下载 &#xff08;centos&#xff09; 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-lates…

个人旅游网(3)——功能详解——旅游路线功能

文章目录 一、旅游路线分类功能1.1、接口详解1.1.1、findAll 二、路线分类下的旅游路线功能2.2、接口详解2.2.1、findRouteListByCid 三、点击单条旅游路线查看其详情功能3.1、接口详解3.1.1、findRouteListByRid 四、分页功能4.1、导入依赖4.2、配置项的配置4.3、实现分页 一、…

Zotero tags(action and tags for zotero)怎么使用

先在下面的网址安装action and tags for zotero&#xff1a; https://github.com/windingwind/zotero-actions-tags 视频讲解&#xff1a; Zotero Tag -> Actions and Tags for Zotero - 远不止标签管理&#xff01;_哔哩哔哩_bilibili 使用方法&#xff1a; 找到一些表情…

Linux驱动(四):Linux2.6字符设备驱动及GPIO子系统

目录 前言一、Linux2.6字符设备驱动的编写1.设备号2.注册设备号3.释放设备号4.核心结构体5.设备相关的 API 函数6.自动创建设备节点 二、GPIO 子系统1.申请所需gpio口资源2.释放gpio口资源3. 配置 gpio 口的工作模式4.获取gpio口的电平状态5.设置 gpio 的电平状态 三、目标实现…

路由引入(ospf+rip)

1.搭建拓扑图 2.配置接口ip地址

IO进程(线程篇)

知识点链接 https://www.yuque.com/aihenaobaijin/camuoq/lscmvf6z1arklau4?singleDoc# 《IO进程》 建议先学习知识点&#xff0c;再进行下面的练习 线程 概念 线程是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程 线程和进程是参与统一的调度 在同一个进程中可…

【RSA】简单说说什么是RSA非对称加密

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是非对称加密2.1 常见的非对称加密有哪些&#xff1f;2.2 哪些场景适合使用…

渗透测试靶机---- DC系列 DC-4

渗透测试靶机---- DC系列 DC-4 开启靶机&#xff0c;登录页面&#xff0c;平平无奇 扫描ip 端口&#xff0c;服务等信息 访问80 登录窗&#xff01;&#xff01;&#xff01; 这里说明了admin信息&#xff0c;那么就直接爆破这个admin的密码 密码&#xff1a;happy 登录成功 在…

64位Office API声明语句第001讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

0.3 学习Stm32经历过的磨难

文章目录 用库函数传参 能否按位或STM32库函数XXX_GetFlagStatus和XXX_GetITStatus的区别 用库函数传参 能否按位或 答案是看清况&#xff0c;而不是一股脑的写&#xff01;&#xff08;血泪的经验啊&#xff09; 可行的情况&#xff1a; //如gpio初始化结构体中的gpiopin参…

坐牢第三十四天(c++)

一.作业 1.栈的手写 #include <iostream> using namespace std; // 封装一个栈 class stcak { private:int *data; //int max_size; // 最大容量int top; // 下标 public:// 无参构造函数stcak();// 有参构造函数stcak(int size);// 拷贝构造函数stcak(const s…

Linux调试器-gdb的使用

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 1.前置知识 程序的发布方式一般有两种&#xff0c;deb…

sql-labs51-55通关攻略

第51关 一.查询数据库 1and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- 二.查表 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase() ),0x7e),1) -- 三.查列 and updatexml(1,concat…