【C++11 之rbegin()、rend() 反向迭代器原理介绍及 重点-限制情况】与正向迭代器对比(互换放在下一p)

C++11 引入了许多新特性,其中包括对 STL(Standard Template Library)的改进。在 STL 容器中,rbegin() 和 rend() 是两个新的成员函数,它们分别返回指向容器最后一个元素的反向迭代器(reverse iterator)和指向容器“理论上的前一个元素”的反向迭代器(该迭代器实际上并不指向任何有效元素,而是作为结束标记)。

反向迭代器介绍

反向迭代器是一种特殊的迭代器,它允许我们按照与正向迭代器相反的顺序遍历容器。也就是说,如果我们使用正向迭代器从容器的开始遍历到结束,那么使用反向迭代器就是从容器的结束遍历到开始。

使用场景

反向迭代器在需要逆序遍历容器元素的场景中非常有用。例如,你可能想要从后向前检查一个字符串是否以某个子串结尾,或者你可能想要逆序打印一个向量的所有元素。

与正向迭代器原理对比

正向迭代器和反向迭代器在原理上的主要区别在于它们如何定义“下一个”元素。对于正向迭代器,++it 将迭代器向前移动到下一个元素;而对于反向迭代器,++it 将迭代器向后移动到“上一个”元素。注意,这里的“上一个”和“下一个”是相对于容器的遍历方向而言的。

代码对比

以下是使用正向迭代器和反向迭代器遍历 std::vector 的示例代码:

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  // 使用正向迭代器遍历  for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {  std::cout << *it << ' ';  }  std::cout << '\n';  // 使用反向迭代器遍历  for (std::vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit) {  std::cout << *rit << ' ';  }  std::cout << '\n';  return 0;  
}

在这个示例中,我们首先使用正向迭代器从前往后遍历 vector,然后使用反向迭代器从后往前遍历 vector。输出将是:

1 2 3 4 5   
5 4 3 2 1

注意,虽然正向迭代器和反向迭代器在语法上有所不同(特别是它们的类型),但它们的用法非常相似:都可以使用 * 运算符来解引用迭代器以访问元素,都可以使用 ++ 运算符来移动迭代器,等等。

看完你会发现反向迭代器其实也没有太多特殊的。是的,但反向迭代器本身设置了很多的限制,所以认识反向迭代器,我们一定要熟悉其限制机制;

重点-限制情况

  1. 依赖双向迭代器:
    反向迭代器通常基于容器的双向迭代器实现。因此,如果容器仅支持单向迭代器(如某些输入迭代器),则无法使用反向迭代器。
    这意味着反向迭代器不能用于如 std::istream_iterator 这样的单向迭代器类型。
  2. 特定操作不可用:
    反向迭代器不支持随机访问迭代器的某些操作,如 operator+=、operator+、operator-=、operator- 和 operator[]。这是因为反向迭代器的内部机制并不直接支持这些操作。
    例如,你不能直接通过 rit + 3 来跳过三个元素(其中 rit 是一个反向迭代器),因为这需要知道“理论上的前一个元素”的位置,这在反向迭代器的上下文中是不可知的。
  3. 引用和指针的语义:(这个难以理解就在下一p中熟悉-C++17新特性)
    反向迭代器的 &*rit(取反向迭代器 rit 指向元素的地址)操作与正向迭代器有所不同。在反向迭代器的上下文中,&*rit 实际上引用的是迭代器在原有序列中引用的元素之外(右侧)一个位置的元素。
    这意味着你不能直接通过反向迭代器来获取容器中元素的原始地址(除非你使用额外的逻辑来转换它)。
  4. 迭代器的有效性:
    反向迭代器的有效性同样受到容器修改操作的影响。如果在遍历过程中修改了容器的大小(如添加或删除元素),则可能导致反向迭代器失效。
    需要注意的是,即使正向迭代器在容器修改后仍然有效,其对应的反向迭代器也可能不再有效。
  5. 类型差异:
    反向迭代器的类型与正向迭代器的类型不同。在 C++ 中,你需要使用如 std::vector::reverse_iterator 这样的类型来声明反向迭代器。
    这意味着你不能直接将正向迭代器赋值给反向迭代器,或者期望它们在类型上兼容。
  6. 使用场景限制:
    虽然反向迭代器在处理需要逆序遍历容器的场景时非常有用,但它们并不适用于所有情况。在某些情况下,使用正向迭代器可能更加直观和高效。

归纳来说,反向迭代器的限制主要源于其基于双向迭代器的设计和实现方式,以及与正向迭代器的差异。这些限制在使用反向迭代器时需要特别注意,以避免潜在的问题和错误。

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

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

相关文章

你不知道的HTML5应用程序缓存:深度揭秘与进阶实践

在HTML5的众多革新之中&#xff0c;应用程序缓存&#xff08;AppCache&#xff09;常常被视为一项被忽视的宝藏。尽管近年来Service Workers逐渐取代了它的位置&#xff0c;AppCache在特定场景下仍展现了其独特的魅力与价值。本文旨在深入挖掘HTML5应用程序缓存的隐藏功能、常见…

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…

C++ shared_ptr

shared_ptr共享它指向的对象&#xff0c;多个shared_ptr可以指向&#xff08;关联&#xff09;相同的对象&#xff0c;在内部采用计数机制来实现。 当新的shared_ptr与对象关联时&#xff0c;引用计数增加1。 当shared_ptr超出作用域时&#xff0c;引用计数减1。当引用计数变为…

YOLOv8改进 | 注意力机制 | 添加适用于遥感图像的LSKblock注意力——【二次创新+完整代码】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 遥感目标检测的研究主要集中在改进方向边界框的表示上,而忽略了遥感场景中独特的先验知识。 这类先验知识对于准确检测微小目标至关重要,因为这些目标往往需要更大的上下文信息才能被正确识别。提出的 LSKNet …

根据身份证获取生日、性别、年龄

当type1时获取出生日期,type2时获取性别,type3时获取年龄 /** 当type1时获取出生日期,type2时获取性别,type3时获取年龄* */ function IdCard(IdCard, type) {if (type 1) {//获取出生日期let birthday IdCard.substring(6, 10) "-" IdCard.substring(10, 12) …

正式环境下的历史数据迁移方案,你知道几个?

一、历史数据库 MySQL 数据库可以很好地支撑海量的 OLTP(Online Transaction Processing)的系统,但是对于海量的互联网业务来说,数据量是非常巨大的。 假设一天 10 亿笔交易,每笔交易至少需要有一条记录,用于记录该笔交易,这就是通常所谓的流水数据。再假设一笔流水占…

C++100行超简单系统

非常好用&#xff0c;小白也可以自己修改 先来看图片&#xff1a; 用法附在代码里了&#xff01; #include <bits/stdc.h> #include <windows.h>using namespace std;struct users {string name;string num; bool f; } u[10000];int now_users 0; /*当前用户数*…

springboot接入springai-openAi代理和智谱ai调用示例

这里写自定义目录标题 背景配置具体代码总结 背景 一说到调用openAI的api或者做一些小项目&#xff0c;大部分例子都是python或者node实现的&#xff0c;后来发现spring出了对于openai的支持框架&#xff0c;所以尝试用一用。这里是SpringAI的地址&#xff0c;有兴趣的可以去官…

20240615在WIN11下的串口调试助手的下载安装以及使用

20240615在WIN11下的串口调试助手的下载安装以及使用 2024/6/15 18:06 百度&#xff1a;串口调试助手 blob:https://apps.microsoft.com/df934d29-fd7a-4873-bb6b-a4ab5a7934c9 串口调试助手 Installer.exe 收发的LOG&#xff1a; rootok3588:/# ./uart_test /dev/ttyS0 11520…

反射,枚举以及lambda表达式

【本节目标】 1. 掌握反射 2. 掌握枚举 3. 掌握lambda表达式使用 反射 1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调…

C++ bfS

岛屿的最大面积 . - 力扣&#xff08;LeetCode&#xff09; 1.刚开始mn又加了int 2.bfs里符合条件了&#xff0c;不push&#xff0c;&#xff0c;&#xff0c;在写什么几把 class Solution { public:int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, 0, 0};bool vis[50][50];int…

从零制作一个ubuntu的docker镜像

上次分享了一下怎么制作centos的镜像&#xff0c;今天给大家分享一下ubuntu的制作方法。 准备ubuntu环境 如果你有Ubuntu环境的话最好&#xff0c;可以直接打包&#xff0c;我用的是CentOS系统&#xff0c;所以需要借助debootstrap工具。 yum -y install epel-release yum -y…

【博士每天一篇文献-算法】Progressive Neural Networks

阅读时间&#xff1a;2023-12-12 1 介绍 年份&#xff1a;2016 作者&#xff1a;Andrei A. Rusu,Neil Rabinowitz,Guillaume Desjardins,DeepMind 研究科学家,也都是EWC(Overcoming catastrophic forgetting in neural networks)算法的共同作者。 期刊&#xff1a; 未录用&am…

调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

简介&#xff1a; 调教LLaMA类模型没那么难&#xff0c;LoRA将模型微调缩减到几小时 LoRA 微调方法&#xff0c;随着大模型的出现而走红。 最近几个月&#xff0c;ChatGPT 等一系列大语言模型&#xff08;LLM&#xff09;相继出现&#xff0c;随之而来的是算力紧缺日益严重。虽…

python如何对list求和

如何在Python中对多个list的对应元素求和&#xff0c;前提是每个list的长度一样。比如&#xff1a;a[1&#xff0c;2&#xff0c;3]&#xff0c;b[2&#xff0c;3&#xff0c;4]&#xff0c;c[3&#xff0c;4&#xff0c;5]&#xff0c;对a&#xff0c;b&#xff0c;c的对应元素…

C语言运算中的临时匿名变量

一&#xff1a;C语言和汇编的区别&#xff08;汇编对应机器操作&#xff0c;C语言对应逻辑操作&#xff09; &#xff08;1&#xff09;C语言叫高级语言&#xff0c;汇编语言叫低级语言 &#xff08;2&#xff09;低级语言的意思是汇编语言和机器操作相对应&#xff0c;汇编语言…

Linux echo输出命令以及重定向符号

echo命令 使用他可以输出指定内容&#xff0c;和编程语言中的 print( )差不多&#xff0c;都是将文字打印输出&#xff0c;该命令无参数。 输出文本 echo "123" 123输出命令执行结果 echo pwd /home/dpc重定向符 > 将左侧的命令结果&#xff0c;覆盖写入右侧…

分数计算 初级题目

今天继续更题。今天的题目是《第五单元 分数的加减法》初级题目。 定位&#xff1a;题目较为初级&#xff0c;适合预习 参考答案&#xff1a;CACCADACAABACBBCDBCB

Linux文件系统【真的很详细】

目录 一.认识磁盘 1.1磁盘的物理结构 1.2磁盘的存储结构 1.3磁盘的逻辑存储结构 二.理解文件系统 2.1如何管理磁盘 2.2如何在磁盘中找到文件 2.3关于文件名 哈喽&#xff0c;大家好。今天我们学习文件系统&#xff0c;我们之前在Linux基础IO中研究的是进程和被打开文件…

【DevOps】 什么是容器 - 一种全新的软件部署方式

目录 引言 一、什么是容器 二、容器的工作原理 三、容器的主要特性 四、容器技术带来的变革 五、容器技术的主要应用场景 六、容器技术的主要挑战 七、容器技术的发展趋势 引言 在过去的几十年里,软件行业经历了飞速的发展。从最初的大型机时代,到后来的个人电脑时代,…