【C++初阶】反向迭代器的实现

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、什么是迭代器
  • 二、如何模拟实现反向迭代器
  • 三、代码实现

一、什么是迭代器

若要访问容器里的元素,最常见的方式可以通过迭代器。迭代器是一个变量,相当于容器和算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。因此,迭代器可以认为是指针,但不一定就是指针。

特别注意:容器stackqueuepriority_queue是不支持迭代器的

常见的迭代器有正向迭代器和反向迭代器

【正向迭代器】
在这里插入图片描述

正向迭代器++是往后遍历,因此遍历的顺序为1 2 3 4

【代码实现】

#include <iostream>
#include <vector>
#include <list>
using namespace std;int main()
{vector<int> v{ 1, 2,3, 4 };vector<int>::iterator vit = v.begin();while (vit != v.end()){cout << *vit << ' ';vit++;}cout << endl;return 0;
}

【输出结果 】

在这里插入图片描述

【反向迭代器】

在这里插入图片描述

对比正向迭代器,反向迭代器++是往前遍历的,因此遍历的顺序为4 3 2 1

【代码实现】

#include <iostream>
#include <vector>
#include <list>
using namespace std;int main()
{vector<int> v{ 1, 2,3, 4 };vector<int>::reverse_iterator vrit = v.rbegin();while (vrit != v.rend()){cout << *vrit << ' ';vrit++;}cout << endl;return 0;
}

【输出结果】

在这里插入图片描述

二、如何模拟实现反向迭代器

我们发现,对比正向迭代器和反向迭代器,只有前后置++/--是有所差别的。因此,对于list可以将原来的正向迭代器给拷贝一份,然后将++运算符重载中修改为指向前一个结点,–-运算符重载修改为指向后一个结点。对于vector可以是类似于实现list正向迭代器一样,封装一个类,,然后运算符重载去处理。

可是以上这样实现就有点麻烦,我们可以看看库是如何实现的

在这里插入图片描述

从上我们可以发现,在库里面其实使用的是适配器来实现反向迭代器的,对正向迭代器进行了封装。用正向迭代器的++实现返向迭代器的++,用正向迭代器的--来实现反向迭代器的--

接下来再来看看库里是如何实现reverse_iterator

在这里插入图片描述

以上接口唯独最奇怪的是解引用,它解引用的结果是当前位置的前一个对象(*--tmp),但是再回过头重新看rbeginrend就会明白(上上图)

在这里插入图片描述

每次解引用都会先得到rbegin前一个位置的数据,直到rbegin == rend遍历结束,这里就体现了一个镜像对称特性,认为反向迭代器与正向迭代器是具有对称关系的

三、代码实现

#pragma once
namespace wj
{template<class Iterator, class Ref, class Ptr>struct ReverseIterator{Iterator _it;typedef ReverseIterator<Iterator, Ref, Ptr> Self;// 正向迭代器构造反向迭代器ReverseIterator(Iterator it):_it(it){}Ref operator*(){// --有副作用,可以拷贝一个副本tmp操作Iterator tmp = _it;return *--tmp;}Ptr operator->(){return &(operator*());}Self& operator++() // 前置{--_it;return *this;}Self operator++(int) // 后置{Iterator tmp(_it);_it--;return tmp;}Self& operator--(){++_it;return *this;}Self& operator--(int){Iterator tmp(_it);_it++;return tmp;;}bool operator!=(const Self& s) const{return _it != s._it;}bool operator==(const Self& s) const{return _it == s._it;}};
}

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

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

相关文章

【基于空间纹理的残差网络无监督Pansharpening】

Unsupervised Pansharpening method Using Residual Network with Spatial Texture Attention &#xff08;基于空间纹理的残差网络无监督泛锐化方法&#xff09; 近年来&#xff0c;深度学习已经成为最受欢迎的泛锐化工具之一&#xff0c;许多相关方法已经被研究并反映出良好…

使用SpaceDesk连接平板作为电脑副屏详细步骤教程

文章目录 下载安装PC端安装安卓端安装 配置步骤PC端安卓端 连接 SpaceDesk官网链接https://www.spacedesk.net/ (应该是需要科学上网才能进入) SpaceDesk它可以连接安卓,苹果的平板,手机等&#xff0c;也可以连接其他可以打开网页&#xff08;HTML5&#xff09;的设备。 这里我…

Mysql读取binlog并分析 binlog

1&#xff0c;Mysql 开启 binlog 配置文件中增加 [mysqld] log-binmysql-bin 2.常用 binlog命令 # 是否启用binlog日志 show variables like log_bin;# 查看详细的日志配置信息 show global variables like %log%;# 查看binlog的目录 show global variables like "%l…

《Flink学习笔记》——第十二章 Flink CEP

12.1 基本概念 12.1.1 CEP是什么 1.什么是CEP&#xff1f; 答&#xff1a;所谓 CEP&#xff0c;其实就是“复杂事件处理&#xff08;Complex Event Processing&#xff09;”的缩写&#xff1b;而 Flink CEP&#xff0c;就是 Flink 实现的一个用于复杂事件处理的库&#xff08…

TCP协议基础

一&#xff1a; TCP协议是什么&#xff1f; TCP协议是基于面向连接&#xff0c;可靠传输&#xff0c;基于字节流的传输层通信协议 1. 面向连接 TCP协议是一种面向连接的协议&#xff0c;意味着在双方在建立数据传输之前&#xff0c;需要进行一个逻辑上的连接&#xff0c;且是…

(vue)Vue项目中使用jsPDF和html2canvas生成PDF

(vue)Vue项目中使用jsPDF和html2canvas生成PDF 效果&#xff1a; 安装与使用 1.&#xff1a;安装jsPDF和html2canvas npm install jspdf html2canvas2.在需要生成PDF文档的组件中引入jsPDF和html2canvas <template><div><el-button type"primary"…

SSL/TLS协议的概念、工作原理、作用以及注意事项

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…

el-table 单击某一行,该行的前面的多选框显示已勾选

目 录 官网&#xff1a; 1. 单页面 2. table是组件 案例&#xff1a; 官网&#xff1a; 1. 单页面 通过单击获取当前行的数据&#xff0c;然后传给选中显示勾选的方法。 <template><el-tableref"multipleTable":data"tableData"tooltip-eff…

linux 下安装chrome 和 go

1. 安装google-chrome 1.1 首先下载google-chrome.deb安装包 之后 安装 gdebi包 sudo apt install gdebi 1.2 安装所要安装的软件 sudo gdebi code_1.81.1-1691620686_amd64.deb 1.3 解决Chrome无法启动问题 rootubuntu:~/Downloads# whereis google-chrome google-chrome…

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法&#xff1a; 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改&#xff0c;若为: : :3306&#xff0c;则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

java比较器、迭代器和枚举类型详解

文章目录 1. 比较器1.1 Comparable实例&#xff1a;对自定义对象进行排序 1.2 Comparator实例&#xff1a;对自定义对象进行排序 1.3 equals1.3.1 equals介绍1.3.2 详解 2. 迭代器2.1 Iterator2.2 ListIterator 3. 枚举3.1 枚举访问3.1 枚举细节 1. 比较器 比较器指的是集合存…

【玩玩Vue】使用el-menu作为菜单时,通过一二级路由控制菜单高亮

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、Vue路由二、路由一级控制高亮&#xff08;常用&#xff09;1.vue中路由文件2.网址样式3.Vue文件4.$route的内容 三、路由二级控制高亮…

element中Notification组件(this.$notify)自定义样式

1、自定义样式效果 2、vue代码 this.notifications this.$notify({title: ,dangerouslyUseHTMLString: true,duration: obj.remindMethod3 ? 0:4500,customClass: notify-warning,offset: 50,showClose: false,message: this.$createElement("div",null,[this.$…

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…

前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)

一、在一个页面&#xff08;不跨页面&#xff09; 效果&#xff1a; 代码 <!DOCTYPE html> <html><head><style>/* 设置标签页外层容器样式 */.tab-container {width: 100%;background-color: #f1f1f1;overflow: hidden;}/* 设置标签页选项卡的样式 …

【C++】C++11新特性 lambda表达式

C11新特性 lambda表达式1、引入2、lambda表达式语法3、 捕获列表说明4、 lambda表达式的原理5、 lambda对象的大小 lambda表达式 1、引入 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法&#xff0c;如果待排序元素为自定义类…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

fastdds之core

目录 Entity Entity

基于JavaWeb和mysql实现校园订餐前后台管理系统(源码+数据库)

一、项目简介 本项目是一套基于JavaWeb和mysql实现网上书城前后端管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…