迭代器的类型共有4种:<T>::Iiterator,<T>::const_iterator,<T>::reverse_iterator,<T>::const_reverse_iterator

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
string line = "you,are,robert";
//返回结果是常量反向迭代器,所以这里必须定义一个常量反向迭代器
string::const_reverse_iterator it = find(line.crbegin(),line.crend(),',');
cout << *it << endl;
//line.crbegin()必须在it的前面,这两个迭代器必须保持字面的先后顺序
//(rbegin就在最前面,rend最后)
string  word(line.crbegin(),it);
//string new_word(word.rbegin(),word.rend());
//sort(word.begin(),word.end());
//sort(word.rbegin(),word.rend());
cout << "cout the word:" << endl;
cout << word << endl;
for(auto i = word.rbegin();i != word.rend();++i)cout  << *i;return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
string line = "you,are,robert";
//返回的是常量的反向迭代器,这里也必须定义相同的类型
string::const_reverse_iterator it = find(line.crbegin(),line.crend(),',');
cout << *it << endl;
//下面的两个迭代器必须类型完全一致(常量特性,是否反向迭代器,crbegin()必须在最前面)
string  word(line.crbegin(),it);
//这里it.base()已经是一个普通的常量迭代器,注意it.base()得到的和it的常量特性是相同的
//所以line.cend()也是一个常量迭代器
string  new_word(it.base(),line.cend());
cout << new_word << endl;return 0;
}

注意:自己总结出如下规则(不足之处批评指正)

(1)reverse_iterator有base()成员函数,可以返回它的普通迭代器.

(2)反向迭代器转换为普通迭代器时候,不改变const特性,例如:string::const_reverse_iterator it      it.base()也是一个常量迭代器,因为转换不改变常量特性

(3)在初始化其余容器类型时候,begin()必须在end()之前(如果有中间元素迭代器也一样),rbegin()必须在rend()之前(如果有中间元素的迭代器也一样)。即迭代器或者反向迭代器必须遵循理论上字面顺序。

(4)用一对迭代器初始化别的容器类型对象的时候,常量特性必须保持一致,是否是反向迭代器也必须一致(尽管通常不用反向迭代器初始化一个string对象,因为会把每个字母倒过来解读)。

例如 vector<int>  elem(it1,it2);it1和it2如果一个是常量迭代器,另一个也必须是(或者都不是常量迭代器)。

而且it1和it2要么都是反向迭代器,要么都不是反向迭代器。

(5)如果是两个迭代器比较的时候,只要只想同一个元素,如果仅仅只有const的差别,那么结果是相等的。

(6)反向迭代器和普通迭代器调用算法的时候:

把普通迭代器初始化反向迭代器,最后得到一组反向迭代器范围,那么处理的范围是一样的,例如:


#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <forward_list>
#include <stack>
#include <vector>
#include <forward_list>
#include <deque>
#include <array>
#include <list>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
//这里假设要反向打印vector中第二个到第七个元素:vector<int> vint{1,2,3,4,5,6,7,8,9,0};ostream_iterator<int> out_iter(cout);//那么根据迭代器的左闭右开准则,给的范围是3-8个,
//接下来把迭代器的3-8个元素转变为反向迭代器it3和it4,
//(it4,it3)这个处理范围对应3-8个范围
//一句话:把一对普通迭代器转换成反向迭代器,处理的范围和原来迭代器范围一样
//运行结果是:76543
vector<int>::reverse_iterator it3(vint.begin() + 2),it4(vint.begin() + 7);
copy(it4,it3,out_iter);//反过来,把一对反向迭代器转化成普通迭代器后,处理范围会改变吗?
vector<int>::iterator i1 = it3.base(),i2 = it4.base();
copy(i1,i2,out_iter);
//运行结果是 34567return 0;
}

(7)c++ primer(5th)365页上说,从普通迭代器给反向迭代器赋值或者初始化,那么得到的不是指向同一个元素的迭代器,但是我在gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 上,不能用普通迭代器给反向迭代器赋值(这里指等号赋值)。

这里必须采用圆括号初始化才可以。赋值本人还不会,有大神会就给我回复一个,谢谢!!!

而反向迭代器给普通迭代器赋值,必须通过反向迭代器的成员函数base()才能实现

迭代器和反向迭代器,常量迭代器和非常量迭代器相关推荐

  1. 常量表达式和非常量表达式

    常量表达式:表达式就是由常量组成的,这时如果计算结果发生溢出,编辑器是会有下划线提醒的. int x = 2147483647 + 10; 非常量表达式:表达式由一个或者多个非常量组成的,这时发生溢出 ...

  2. c++ 表达式必须包含指向类的指针类型_C++:18const关键字(附常量指针、指针常量、常量指针常量)...

    一.const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10; a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10; co ...

  3. 【C++】迭代器、反向迭代器详解

    参考: http://c.biancheng.net/view/338.html https://blog.csdn.net/kjing/article/details/6936325 https:/ ...

  4. 插入迭代器、流迭代器、反向迭代器、移动迭代器

    文章目录 前言 插入迭代器 inserter front_inserter back_inserter iostream迭代器 istream_iterator 读取输入流 istream_itera ...

  5. c++迭代器iterator通用吗_「ES6基础」迭代器(iterator)

    迭代器(iterator)是一个结构化的模式,用于从源以一次一个的方式提取数据.迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与 ...

  6. Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 ...

  7. 非常量引用的初始值必须为左值解决方式

    看下面的这个函数与调用,这个时候就会出现非常量引用的初始值必须为左值解决方式的错误 修改方法:函数声明的时候,加一个constPoint3f getWorldPoints(const Point2f& ...

  8. [转载]非常量引用的初始值必须为左值的问题

    首先,先看下面一个例子: eg.1 #include<</span>iostream> usingnamespace std; int main(){ int i =2; do ...

  9. boost::foreach模块非常量右值的测试程序

    boost::foreach模块非常量右值的测试程序 实现功能 C++实现代码 实现功能 boost::foreach模块非常量右值的测试程序 C++实现代码 #include <vector& ...

最新文章

  1. html5和html的区别是什么(精问)
  2. 去除Coding4Fun中MessagePrompt的边框(Border)
  3. admininfo.php,admin.php 源代码在线查看 - FTB安装版 v1.3(虚拟形象)FTB安装版 v1.3(虚拟形象) 资源下载 虫虫电子下载站...
  4. python中的argparse包——用于解析命令行参数
  5. Java Excel导出
  6. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
  7. hc06蓝牙模块介绍_SKYLAB|基于蓝牙工卡的主被动一体化室内定位方案
  8. kafka消费报错:org.apache.kafka.common.errors.WakeupException: null
  9. appium工作原理及启动方式
  10. 海信电视老出现android是什么意思,海信电视屏幕上显示“智能电视系统启动中,请稍后”是什么意思?怎样处理?- 一起装修网...
  11. ra8873 ST7789区别
  12. cents OS7配置 php curl.so方法
  13. EXCEL的VLOOKUP匹配失败是什么原因呢
  14. 几百块的投影仪靠谱吗?性能怎么样?
  15. php qq授权_PHP模拟QQ网页版授权登录的案例
  16. 中国求职者2亿私人简历泄露,APT情报资讯报告2018全球十大安全事件(10401字) (附PDF公号发“简历十大安全”下载)
  17. 单片机硬件电路设计实例分析
  18. 动手深度学习13:计算机视觉——语义分割、风格迁移
  19. enq: HW - contention
  20. php 合成图片 微信公众号合成海报

热门文章

  1. Cramfs、JFFS2、YAFFS2的全面对比
  2. 【Spring 基础篇三】属性注入与属性编辑器
  3. Android的基本常用的短信操作
  4. SharePoint 2010 隐藏快速启动栏(左侧导航)
  5. EXT核心API详解(二)-Array/Date/Function/Number/String
  6. 近似与精确——《狂人C》习题解答15(第三章习题5)
  7. 转发: Visual Studio 2005常用插件
  8. 【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例
  9. LeetCode Algorithm 240. 搜索二维矩阵 II
  10. 2018/Province_Java_A/1/分数