【反向迭代器】—— 我与C++的不解之缘(十七)

前言

​ 在STL中的迭代器部分,之前只关注与正向迭代器,忽视了反向迭代器;现在来看一下反向迭代器到底是个什么东西,以及反向迭代器怎么实现,怎么为之前自己模拟实现的容器增加反向迭代器?

反向迭代器的使用

​ 首先,先来看一下反向迭代器是个什么东西,怎么使用?
在这里插入图片描述

这里以vectorlist 为例,看一下正向迭代器和反向迭代器的区别。

vector 的反向迭代器

#include<iostream>
#include<vector>
#include<list>using namespace std;
void test_vector()
{vector<int> v;int arr[] = { 1,2,3,4,5,6,7,8,9 };for (auto e : arr){v.push_back(e);}//正向迭代器vector<int>::iterator it = v.begin();cout << "正向迭代器遍历: ";while (it != v.end()){cout << *it << " ";++it;}cout << endl;//反向迭代器vector<int>::reverse_iterator rit = v.rbegin();cout << "反向迭代器遍历: ";while (rit != v.rend()){cout << *rit << " ";++rit;}cout << endl;
}int main()
{test_vector();return 0;
}

输出结果:

正向迭代器遍历: 1 2 3 4 5 6 7 8 9
反向迭代器遍历: 9 8 7 6 5 4 3 2 1

list 的反向迭代器

void test_list()
{list<int> l;int arr[] = { 1,2,3,4,5,6,7,8,9,0 };for (auto e : arr){l.push_back(e);}list<int>::iterator it = l.begin();cout << "正向迭代器遍历: ";while (it != l.end()){cout << *it << ' ';++it;}cout << endl;list<int>::reverse_iterator rit = l.rbegin();cout << "正向迭代器遍历: ";while (rit != l.rend()){cout << *rit << ' ';++rit;}cout << endl;
}int main()
{//test_vector();test_list();return 0;
}
正向迭代器遍历: 1 2 3 4 5 6 7 8 9 0
正向迭代器遍历: 0 9 8 7 6 5 4 3 2 1

​ 通过结果,我们可以看到,无论是vector 还是list 正向迭代器是正向遍历,而反向迭代器则是反向遍历。

再回过头看rbeginrend 函数:

  • rbegin 函数,返回容器一个指向容器最后一个元素的反向迭代器。。
  • rend 函数,返回容器表示反向迭代结束的反向迭代器。

反向迭代器的模拟实现

​ 看完反向迭代器的使用,那反向迭代器到底是如何实现的呢?

如果第一次看到这个问题,感觉会和第一次看到const_iterator 那样,想着去单独实现一个反向迭代器,但是那样太麻烦了。

根据正向迭代器和反向迭代器的使用比较,我们发现几个特点:

  • 反向迭代器的++ 相当于正向迭代器的--
  • 反向迭代器的-- 相当与正向迭代器的++

​ 那么这样,我们是不是就可以考虑将反向迭代器写成一个模板呢,只要你给我传模板参数(iterator 正向迭代器),我就能给你生成其对应的反向迭代器。

反向迭代器实现模板:

namespace HL
{template<class Iterator, class Ref, class Ptr>class my_reverse_iterator{typedef my_reverse_iterator<Iterator, Ref, Ptr> self;public:my_reverse_iterator() {}my_reverse_iterator(const Iterator& it){_it = it;}self operator--(){Iterator ret = _it;--_it;return ret;}self operator--(int){--_it;return _it;}self operator++(){Iterator ret = _it;++_it;return ret;}self operator++(int){++_it;return _it;}bool operator==(const self& it) const{return _it == it._it;}bool operator!=(const self& it) const{return _it != it._it;}Ref operator*(){	Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return _it->;}private:Iterator _it;};
}

​ 到这里,反向迭代器就简单的实现出来了(自己写的与库里面的不一样),现在来对应一下vectorlist

vector

​ 这里用一下之前的代码,来对应使用一个反向迭代器。

源代码链接:study/study_11_17_反向迭代器 · 努力学习的小廉/C++学习 - 码云 - 开源中国

由于代码过长,这里就只显示增加的部分了。

	public: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());}reverse_iterator rend(){return reverse_iterator(begin());}

list

	public:typedef reverse_iterator<iterator, T&, T*> iterator;typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;reverse_iterator rebgin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}

​ 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

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

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

相关文章

无人机与低空经济:开启新质生产力的新时代

无人机技术作为低空经济的核心技术之一&#xff0c;正以其独特的优势在多个行业中发挥着重要作用&#xff0c;成为推动新质生产力革命的重要力量。无人机的应用范围广泛&#xff0c;从农业植保到物流配送&#xff0c;从城市监测到紧急救援&#xff0c;无人机的身影无处不在&…

ElasticSearch7.x入门教程之中文分词器 IK(二)

文章目录 前言一、内置分词器二、中文IK分词器&#xff08;第三方&#xff09;三、本地自定义四、远程词库总结 前言 ElasticSearch 核心功能就是数据检索&#xff0c;首先通过索引将文档写入 es。 查询分析则主要分为两个步骤&#xff1a; 1、词条化&#xff1a;分词器将输入…

宏景HCM uploadLogo.do接口存在任意文件上传漏洞

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 宏景HCM是一款基于先进的人力资本管理体系和灵活开放的技术架构的企…

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题

原文地址Linux&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …

MATLAB绘图基础11:3D图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 11.3D图形绘制 11.1 3D图概述 M A T L A B {\rm MATLAB} MATLAB的 3 D {\rm 3D} 3D图主要有&#xff1a; 3 D {\rm 3D} 3D散点图、 3 D {\rm 3D} 3D线图、 3 D {\rm 3D} 3D曲面图、 3 D {\rm…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

Bug:gomonkey系列问题(undefined: buildJmpDirective)

Bug&#xff1a;gomonkey系列问题(undefined: buildJmpDirective) 最近拉代码发现其他同事写单测使用的是gomonkey&#xff0c;我本地mac m3芯片执行报错&#xff0c;gomonkey: undefined: buildJmpDirective。 对go convey不熟悉的朋友可以看这篇文章&#xff1a; Go Convey测…

Arcgis 地图制作

地图如下,不同历史时期&#xff1a;

【AI编程实战】安装Cursor并3分钟实现Chrome插件(保姆级)

Cursor介绍 https://www.cursor.com/ 一句话介绍&#xff1a;AI代码编辑器&#xff0c;当前最火的AI编程器 软件下载与安装 下载 打开Cursor官网下载&#xff0c;会根据操作系统的差别进行选择 https://www.cursor.com/ 这里下载的内容很小&#xff0c;是个安装器&#x…

C指针之舞——指针探秘之旅(2)

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏&#xff1a;C语言学习专栏 在上一篇博客文章&#xff1a;C指针之舞——指针探秘之旅-CSDN博客中&#xff0c;我们学习了字符指针&#xff0c;指针数组&#xff0c;数组指针&#xff0c;数组传参和指针传参等内容&#xff0c;…

大数据新视界 -- Impala 性能优化:量子计算启发下的数据加密与性能平衡(下)(30 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

RPC框架负载均衡

什么是负载均衡&#xff1f; 当一个服务节点无法支撑现有的访问量时&#xff0c;会部署多个节点&#xff0c;组成一个集群&#xff0c;然后通过负载均衡&#xff0c;将请求分发给这个集群下的每个服务节点&#xff0c;从而达到多个服务节点共同分担请求压力的目的。 负载均衡主…

JMeter监听器与压测监控之 InfluxDB

1. 简介 在本文中&#xff0c;我们将介绍如何在 Kali Linux 上通过 Docker 安装 InfluxDB&#xff0c;并使用 JMeter 对其进行性能监控。InfluxDB 是一个高性能的时序数据库&#xff0c;而 JMeter 是一个开源的性能测试工具&#xff0c;可以用于对各种服务进行负载测试和性能监…

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…

如何判断注入点传参类型--理论

注入点传参类型 在我们找到注入点后&#xff0c;首先要判断传参的类型&#xff0c;才能以正确的形式向数据库查询数据。 注入点传参一般分为数字型和字符型。 数字型&#xff1a;当传入的参数为整形时&#xff0c;存在SQL注入漏洞&#xff0c;就可以认为是数字型注入。 字符…

HarmonyOS(57) UI性能优化

性能优化是APP开发绕不过的话题&#xff0c;那么在HarmonyOS开发过程中怎么进行性能优化呢&#xff1f;今天就来总结下相关知识点。 UI性能优化 1、避免在组件的生命周期内执行高耗时操作2、合理使用ResourceManager3、优先使用Builder方法代替自定义组件4、参考资料 1、避免在…

AI Prompt Engineering

AI Prompt Engineering 简介 Prompt Engineering, 提示工程&#xff0c;是人工智能领域的一项技术&#xff0c;它旨在通过设计高效的提示词&#xff08;prompts&#xff09;来优化生成式 AI&#xff08;如 GPT、DALLE 等&#xff09;的输出。提示词是用户与生成式 AI 交互的核…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中&#xff0c;加油站作为重要的能源供应点&#xff0c;面临着安全监管与风险管理的双重挑战。为应对这些问题&#xff0c;安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

大语言模型中ReLU函数的计算过程及其函数介绍

文章目录 概要ReLU定义 概要 **ReLU 作用&#xff1a;**主要用于为神经网络引入非线性能力&#xff0c;作用是将输入中的整数保留原值&#xff0c;负数置为 0。 从而在层与层之间引入非线性&#xff0c;使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xff1a;**Lla…