当前位置: 首页 > news >正文

<C++> 反向迭代器

我们知道正向迭代器的设计:begin迭代器指向第一个数据,end迭代器指向最后一个数据的下一个位置 。++移向下一个数据,解引用得到数据的值,并根据容器储存方式的不同,容器有不同类型的迭代器。

注意:rbegin迭代器指向最后一个数据的下一个位置,rend迭代器指向第一个数据,这里就体现了镜像对称,正向与反向迭代器成为对称关系。

        可是,如果按照rebegin指向的位置,第一次解引用得到的应该是随机值,这是有问题的,那么stl解决方案是什么呢?它采用的方法是:解引用得到的是rebegin迭代器前一个位置的数据

        为了简便,反向迭代器采用的是适配器模式,适配正向迭代器,反向迭代器的++将调用正向迭代器的--,反之亦然。

例如:

         我们给出统一的反向迭代器模板,对于各容器,由模板实现各自的迭代器。给模板什么正向迭代器,它就适配出相应容器的反向迭代器

#pragma oncenamespace my_ReverseIterator
{template<class Iterator, class Ref, class Ptr>struct ReverseIterator{typedef ReserveIterator<Iterator, Ref, Ptr> self;Iterator _it;ReverseIterator(Iterator it):_it(it){}Ref operator*() {Iterator tmp = _it;return *(--tmp);	//这里没有模板类型,该返回什么类型呢?1. 萃取 2. 使用者在模板处给出}Ptr operator->(){return &(operator*());}self& operator++(){--_it;return *this;}self& operator--(){++_it;return *this;}bool operator!=(const self& s) const{return _it != s._it;}};
}

我们补充上list、vector容器的迭代器

例如:list

		typedef __list_iterator<T, T&, T*> iterator;	//迭代器要公有,让外面可以使用typedef __list_iterator<T, const T&, const T*> const_iterator;typedef ReverseIterator<iterator, T&, T*> reverse_iterator;typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;//用 end 适配 rbeginreverse_iterator rbegin(){return reverse_iterator(end());}//用 begin 适配 rendreverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){//由指针类型隐式转换为iterator类//return _head->_next;//也可以用匿名对象return iterator(_head->_next);}iterator end(){return iterator(_head);}

例如:vector

		typedef T* iterator;typedef const T* const_iterator;//此时反向迭代器是自定义类型typedef ReverseIterator<iterator, T&, T*> reverse_iterator;typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){return _start;}iterator end(){return _finish;}

其余容器也相同 


        反向迭代器也是适配器模式

        最后,如果小帅的本文哪里有错误,还请大家指出,请在评论区留言(ps:抱大佬的腿),新手创作,实属不易,如果满意,还请给个免费的赞,三连也不是不可以(流口水幻想)嘿!那我们下期再见喽,拜拜!

相关文章:

<C++> 反向迭代器

我们知道正向迭代器的设计&#xff1a;begin迭代器指向第一个数据&#xff0c;end迭代器指向最后一个数据的下一个位置 。移向下一个数据&#xff0c;解引用得到数据的值&#xff0c;并根据容器储存方式的不同&#xff0c;容器有不同类型的迭代器。 注意&#xff1a;rbegin迭代…...

【EI会议征稿】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#…...

格力报案称“高管遭自媒体侮辱诽谤”

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 王自如的一番话引来了众多围攻&#xff0c;格力已报警&#xff0c;高管遭到侮辱诽谤。这应该是近年来少见的大企业和网络大v之间公开翻脸互撕的场景了! 就在今天格力就高管遭自媒体侮辱诽谤报案。…...

HBase之Compaction

目录 Compaction触发条件相关参数 文件选取策略ExploringCompactionPolicy常见优化 Compaction 随着memstore的不断flush&#xff0c;storefile的数量将会不断增加。compaction将通过合并storefile来减少文件数量&#xff0c;并提高读性能。conpaction以store为单位 Compacti…...

设计模式之结构型模式

这些模式关注对象之间的组合和关联方式&#xff0c;以便形成更大的结构和功能。 适配器模式&#xff08;Adapter Pattern&#xff09;桥接模式&#xff08;Bridge&#xff09;装饰器模式&#xff08;Decorator&#xff09;组合模式&#xff08;Composite&#xff09;外观模式&a…...

centOs 6.10 编译 qt 5.15.11

安装依赖库 xcb 依赖库 qt xcb 需要的依赖 如何要用 x11, 就要在编译的时候加上 -xcb 选项&#xff0c;就要安装 xcb 相关的库。 到时可以在 config.log 文件查看&#xff0c;缺少哪个库就安装哪个。 下面是我手动安装的库和对应版本&#xff1a; xcb-proto-1.14.tar.gz x…...

Redis对象的数据结构及其原理汇总

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;Redis对象的数据结构及其底层实现原理汇总 当我们被问到 Redis 中有什么数据结构&#xff0c;或者说数据类型&#xff0c;我们可能会说有字符串、列表、哈希、集合、有序集合。 其实这几种数据类型在 Redis 中都由…...

@RestController 注解网页返回 [] ,出现的bug

RestController 注解网页返回 [] ,出现的bug RestController RequestMapping("emp") public class EmployeeController {Autowiredprivate EmployeeService employeeService;GetMapping("find")public List<Employee> find(){List<Employee> …...

C语言指针详解(1)(能看懂字就能明白系列)文章超长,慢慢品尝

目录 1、内存和地址 2、指针简介 与指针相关的运算符&#xff1a; 取地址操作符&#xff08;&&#xff09; 解引用操作符&#xff08;间接操作符&#xff09;&#xff08;*&#xff09; ​编辑 指针变量的声明 指针变量类型的意义 指针的基本操作 1、指针与整数相加…...

为什么别人年薪30W+?同样为测试人,“我“的测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试员&am…...

【Unity】XML文件的解析和生成

目录 使用XPath路径语法解析 使用xml语法解析 XML文件的生成 XML文件是一种常用的数据交换格式&#xff0c;它以文本形式存储数据&#xff0c;并使用标签来描述数据。解析和生成XML文件是软件开发中常见的任务。 解析XML文件是指从XML文件中读取数据的过程。在.NET中&#…...

Vue h5页面手指滑动图片

场景&#xff1a; 四张图&#xff0c;要求随着手指滑动而滑动 代码&#xff1a; imgs是父盒子 poster-item是每个图片 .imgs {white-space: nowrap;overflow: hidden;overflow-x: auto;margin-bottom: 17px;.poster-item {display: inline-block;vertical-align: middle;wid…...

Python类属性下划线的意义

在Python中&#xff0c;类属性&#xff08;class attribute&#xff09;前面带有下划线的命名约定有一些特殊的含义&#xff0c;但它并不会影响属性的实际行为。这是一种命名约定&#xff0c;用于指示属性的用途和访问级别。以下是一些常见的下划线命名约定&#xff1a; 1. 单…...

DbUtils概述

概述 JDBC实用工具组件 Commons DbUtils库是一个小的类集&#xff0c;旨在使使用JDBC更容易。JDBC资源清理代码是平凡的&#xff0c;容易出错的工作&#xff0c;所以这些类从代码中抽象出所有的清理任务&#xff0c;留给你真正想用JDBC做的事情&#xff1a;查询和更新数据。 …...

大数据基础设施搭建 - Hadoop

文章目录 一、下载安装包二、上传压缩包三、解压压缩包四、配置环境变量五、测试Hadoop5.1 测试hadoop命令5.2 测试wordcount案例5.2.1 创建wordcount输入文本信息5.2.2 执行程序5.2.3 查看结果 六、分发压缩包到集群中其他机器6.1 分发压缩包6.2 解压压缩包6.3 配置环境变量 七…...

测试开发环境下centos7.9下安装docker的minio

按照以下方法进行 1、安装docker&#xff0c;要是生产等还是要按照docker-ce yum install docker 2、启动docker service docker start 3、 查看docker信息 docker info 4、加到启动里 systemctl enable docker.service 5、开始docker pull minio/minio 但报错&#x…...

Django之模版层

目录 一、常用语法 二、模版语法之变量 三、模板之过滤器(Filters) 【1】default 【2】length 【3】filesizeformat 【4】slice 【5】date 【6】safe 【7】truncatechars 【8】其它过滤器&#xff08;了解&#xff09; 四、模版之标签 【1】for标签 【2】if 标签…...

spark性能调优 | 内存优化

目录 我们先了解一下有哪些内存温馨提示RDD示范(spark版本2.1.1)RDD进行优化Df和Ds进行示范 我们先了解一下有哪些内存 1.storage内存 存储数据&#xff0c;缓存 可预估2.shuffle内存 计算join groupby 不可预估spark1.6之前 静态管理的&#xff0c;spark1.6之…...

【PG】PostgreSQL高可用之自动故障转移-repmgrd

前言 上面的几篇文章介绍了repmgr的部署&#xff0c;手动进行 从节点提升&#xff0c;主从切换&#xff0c;孤立从从节点找到新的主库等操作&#xff0c;但是都是需要通过手动去执行命令。大家都知道&#xff0c;在线上生产环境中数据库每秒钟的不可用都会造成严重的事故&am…...

操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求

基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能&#xff1a; ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...