【C++】反向迭代器(rbegin,rend)(转载)
转自:http://blog.csdn.net/kjing/article/details/6936325
rbegin和rend,很有用!
C++ primer (中文版第四版)第273页
9.3.2 begin和end成员
begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置
上述每个操作都有两个不同的版本:一个是const成员,另一个是非const成员。这些操作返回什么类型取决于容器是否为const。如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型要加上const_前缀,也就是const_iterator和const_reverse_iterator类型。
第353页
11.3.3 反向迭代器
反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代 器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。
回想一下,所有容器都定义了 begin 和 end 成员,分别返回指向容器首元素和尾元素下一位置的迭代器。容器还定义了 rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置的反向迭代器。与普通迭代器一样,反向迭代器也有常量(const)和非常量(nonconst)类型。图 11.1 使用一个假设名为 vec 的 vector 类型对象阐明了这四种迭代器之间的关系。
假设有一个 vector 容器对象,存储 0-9 这 10 个以升序排列的数字:
vector<int> vec;for (vector<int>::size_type i = 0; i != 10; ++i)vec.push_back(i); // elements are 0,1,2,...9
下面的 for 循环将以逆序输出这些元素:
// reverse iterator of vector from back to frontvector<int>::reverse_iterator r_iter;for (r_iter = vec.rbegin(); // binds r_iter to last elementr_iter != vec.rend(); // rend refers 1 before 1st element++r_iter) // decrements iterator one elementcout << *r_iter << endl; // prints 9,8,7,...0
虽然颠倒自增和自减这两个操作符的意义似乎容易使人迷惑,但是它让程序员可以透明地向前或向后处理容器。例如,为了以降序排列 vector,只需向 sort传递一对反向迭代器:
// sorts vec in "normal" ordersort(vec.begin(), vec.end());// sorts in reverse: puts smallest element at the end of vecsort(vec.rbegin(), vec.rend());
1.反向迭代器需要使用自减操作符
从一个既支持 -- 也支持 ++ 的迭代器就可以定义反向迭代器,这不用感到吃惊。毕竟,反向迭代器的目的是移动迭代器反向遍历序列。标准容器上的迭代器既支持自增运算,也支持自减运算。但是,流迭代器却不然,由于不能反向遍历流,因此流迭代器不能创建反向迭代器。
2.反向迭代器与其他迭代器之间的关系
假设有一个名为 line 的 string 对象,存储以逗号分隔的单词列表。我们希望输出 line
中的第一个单词。使用 find 可很简单地实现这个任务:
// find first element in a comma-separated liststring::iterator comma = find(line.begin(), line.end(), ',');cout << string(line.begin(), comma) << endl;
如果在 line 中有一个逗号,则 comma 指向这个逗号;否则,comma 的值为 line.end()。在输出 string 对象中从 line.begin() 到 comma 的内容时,从头开始输出字符直到遇到逗号为止。如果该 string 对象中没有逗号,则输出整个 string字符串。
如果要输出列表中最后一个单词,可使用反向迭代器:
// find last element in a comma-separated liststring::reverse_iterator rcomma = find(line.rbegin(), line.rend(), ',');
因为此时传递的是 rbegin() 和 rend(),这个函数调用从 line 的最后一个字符开始往回搜索。当 find 完成时,如果列表中有逗号,那么 rcomma 指向其最后一个逗号,即指向反向搜索找到的第一个逗号。如果没有逗号,则 rcomma 的值为 line.rend()。
在尝试输出所找到的单词时,有趣的事情发生了。直接尝试:
// wrong: will generate the word in reverse ordercout << string(line.rbegin(), rcomma) << endl;
会产生假的输出。例如,如果输入是: FIRST,MIDDLE,LAST 则将输出 TSAL!
图 2 阐明了这个问题:使用反向迭代器时,以逆序从后向前处理 string对象。为了得到正确的输出,必须将反向迭代器 line.rbegin() 和 rcomma 转换为从前向后移动的普通迭代器。其实没必要转换 line.rbegin(),因为我们知道转换的结果必定是 line.end()。只需调用所有反向迭代器类型都提供的成员 函数 base 转换 rcomma 即可:
// ok: get a forward iterator and read to end of linecout << string(rcomma.base(), line.end()) << endl;
假设还是前面给出的输入,该语句将如愿输出 LAST。
图 2. 反向迭代器与普通迭代器之间的区别
图 2 显示的对象直观地解释了普通迭代器与反向迭代器之间的关系。例如,正如 line_rbegin() 和 line.end() 一样,rcomma 和 rcomma.base() 也指向不同的元素。为了确保正向和反向处理元素的范围相同,这些区别必要的。从技术上来说,设计普通迭代器与反向迭代器之间的关系是为了适应左闭合范围 (第 9.2.1 节)这个性质的,所以,[line.rbegin(), rcomma) 和[rcomma.base(), line.end()) 标记的是 line 中的相同元素。 反向迭代器用于表示范围,而所表示的范围是不对称的,这个事实可推导出一个重要的结论:使用普通的迭代器对反向迭代器进行初始化或赋值时,所得到的迭代器并不是指向原迭代器所指向的元素。
转载于:https://www.cnblogs.com/helloWaston/p/4595000.html
【C++】反向迭代器(rbegin,rend)(转载)相关推荐
- std::string中的反向迭代器rbegin()和rend()
在std::string中,有个接口是rbegin()和rend(),分别表示string字符串的倒数第一个字符和正数第一个字符: rbegin():表示string字符串的倒数第一个字符 rend( ...
- C++日记——Day5:迭代器、begin()/end(),rbegin()/rend()、迭代器失效、const_iterator
迭代器简介 迭代器是一种遍历容器内元素的一种数据类型,这种数据类型感觉有点像指针,我们理解的时候可以理解为欸带起用来指向容器中某个元素. string,vector,[],很少用[],更常用的访问方式 ...
- C++ [STL容器反向迭代器]
本文已收录至<C++语言和高级数据结构>专栏! 作者:ARMCSKGT STL容器反向迭代器 前言 正文 适配器 反向迭代器 反向迭代器框架 默认成员函数 反向迭代器的遍历 反向迭代器的比 ...
- C++进阶——反向迭代器Reverse_iterator
C++进阶--反向迭代器Reverse_iterator Reverse_iterator反向迭代器介绍 之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错 ...
- 【C++】STL——string的简单介绍、string类的访问和遍历、operator[] 、begin+ end begin 、rbegin + rend begin 、范围for
文章目录 1.string类 1.1string类对象的访问及遍历操作 (1)operator[] (2)begin+ end begin (3)rbegin + rend begin (4)范围fo ...
- 反向迭代器(rbegin,rend)
C++ primer (中文版第四版)第273页 9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示.这两个迭代器通常用于标 ...
- 反向迭代器(rbegin,rend)详解
反向迭代器详解 stl中如何设计反向迭代器 反向迭代器顾名思义就是帮助容器从后向前遍历的一种迭代器,有const和非const版本区别,利用模板可以实现两种版本代码的复用 stl中反向迭代器的设计使用 ...
- begin end rbegin rend 迭代器
位置 str.begin():指向字符串的第一个字符的位置 str.end();指向字符串的最后一个字符的后一个位置: str.rbegin();指向字符串的最后一个字符的位置: str.rend() ...
- 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】
今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...
- Vector反向迭代器使用
反向迭代器 1 反向迭代器其实没什么特殊的,他只是在遍历的方向上和普通迭代器不通而已:每一个容器里面都有Iterator(迭代器),可以从容器的begin位置到end-1位置,通过++来遍历.同样也有 ...
最新文章
- ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)
- (一:NIO系列)JAVA NIO 简介
- js中判断-0 ,js无穷数Infinity
- USTC English Club Note20211208
- UIGestureRecognizer与UIButton Action在同一界面冲突的问题
- cacti linux cpu datasource,Cacti监控Cisco CPU 以及内存
- Matrix Problem
- [Leedcode][JAVA][第355题][设计推特][面向对象][哈希表][链表][优先队列]
- linux文字大小,Qt 字体大小的计算
- 获取矩阵元素的方法 4种方法 B(1,2) B(9) B(sub2ind(size(B),3,4))
- 控制策略 | PI控制器积分分离的仿真分析
- 偏最小二乘法(R语言)
- 测试 tolua 例子 TestErrorStack
- 你的网名OUT了吗?盘点那些曾经超in的网名
- 计算机管理 合并分区,硬盘分区进行合并 硬盘分区后怎么合并
- 应用在触摸面板中的电容式触摸芯片
- 一步一步实现微信抢红包
- Android7.1.1 remap鼠标右键为返回键
- 企业电销如何获得高质量精准流量,大数据获客直击精准客流
- 基于Java毕业设计新冠疫苗接种预约系统登录源码+系统+mysql+lw文档+部署软件
热门文章
- todo: 网口驱动
- Django Form 详解
- ubuntu /etc/profile和/etc/environment的比较
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- 如何创建git账户的chroot
- Android AIDL Service 跨进程传递复杂数据
- php位置,php – 如何有效地找到一个给定位置附近最近的位置
- ‘,‘ expected.Vetur(1005)
- element-ui表单验证时需要number类型
- 响应式开发(黑马教程笔记)-Bootsrap