当前位置: 首页 > 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;程序中的逻辑地…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...