【C++ Primer | 10】再探迭代器

反向迭代器

1. 测试代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<iterator>
 4 using namespace std;
 5
 6 int main()
 7 {
 8     vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 9     for (auto r_iter = vec.crbegin(); r_iter != vec.crend(); ++r_iter)
10         cout << *r_iter << " ";
11     cout << endl;
12     return 0;
13 }

输出结果:

2. 测试代码:

 1 #include <iostream>
 2 #include <deque>
 3 #include <algorithm>
 4 #include <iterator>
 5 using namespace std;
 6
 7 void print(int elem)
 8 {
 9     cout << elem << ‘ ‘;
10 }
11
12 int main()
13 {
14     deque<int> coll;
15     for (int i = 1; i <= 9; ++i)
16         coll.push_back(i);
17
18     deque<int>::iterator pos1;
19     pos1 = find(coll.begin(), coll.end(), 2);
20
21     deque<int>::iterator pos2;
22     pos2 = find(coll.begin(), coll.end(), 7);
23     for_each(pos1, pos2, print);
24     cout << endl;
25
26     deque<int>::reverse_iterator rpos1(pos1);
27     deque<int>::reverse_iterator rpos2(pos2);
28     for_each(rpos2, rpos1, print);
29     cout << endl;
30     return 0;
31 }

输出结果:

【分析】

代码首先在一个deque中插入1到9,然后查找元素值为2和7的位置,分别赋值给迭代器pos1和pos2,然后输出,由于STL中的操作总是左开右闭的区间,即[2,7),所以输出2 3 4 5 6,7不会输出。

接下来将迭代器转换成逆向迭代器,再次输出,对于反向迭代器,由于是反向,所以按逻辑来说它是左开右闭的(这里我尝试了rpos2为iterator.end(),rpos1为iterator.begin(),此时输出全部),即(7,2](事实上还是左闭右开,只不过此时的左和iterator顺序一样)。所以输出6 5 4 3 2,下面的图片解释的很清楚。

原文地址:https://www.cnblogs.com/sunbines/p/9767073.html

时间: 2024-11-08 04:12:22

【C++ Primer | 10】再探迭代器的相关文章

【足迹C++primer】33、再探迭代器

再探迭代器 这里有插入迭代器,有流迭代器,反向迭代器,移动迭代器. 插入迭代器 这是一种迭代器适配器,接受一个容器,生成一个迭代器,实现向给定容器添加元素. 插入迭代器有三种类型,差异在于元素插入的位置 back_inserter创建一个使用push_back的迭代器. front_inserter创建一个使用push_front的迭代器. inserter创建一个使用insert的迭代器. void fun1() { list<int> lst={1,2,3,4}; list<int&

【C++ Primer 第10章】再探迭代器

反向迭代器 • 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器.对于反向迭代器,递增(以及递减)操作的含义会颠倒过来. • 递增一个反向迭代器(++it)会移动到前一个元素:递减一迭代器(--it)会移动到下一个元素. • 除了forward_list之外,其他容器都支持反向迭代器.我们可以通过调用rbegin.rcend.crbegin和crend成员函数来获得反向迭代器.这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器.与普通迭代器一样,反向迭代器也有const和非cons

10.4 再探迭代器-插入/IO/反向

10.4.1 插入迭代器 插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素 (1)back_inserter: 接受一个参数, 示例: auto iter = back_inserter(iVec): iter = value: (2)front_inserter: 接受一个参数, 示例: auto iter = front_inserter(iVec): iter = value: (3)inserter: 接受两个参数,示例:auto iter = inser

再探迭代器

插入迭代器 迭代器被绑定到一个容器上,可用来向容器插入元素. back_inserter创建一个使用push_back的迭代器 front_inserter创建一个使用push_front的迭代器 inserter创建一个使用insert的迭代器,此函数接受哦第二个参数,这个参数必须是指向一个给定容器的迭代器.元素将被插入到给定迭代器所表示的元素之前. list<int> lst = {1,2,3,4}; list<int> lst1, lst2; //空list //拷贝完成之后

C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对象将一个值序列写入流中,其操作过程与使用迭代器将一组值逐个赋值给容器中的元素同样: ostream_iterator<string> out_iter(cout,"\n"); istream_iterator<string> in_iter(cin),eof; wh

【足迹C++primer】19、构造函数再探

首先说一下为什么要特别写一个文档来说明这个层次结构的事情,各位都在eclipse中使用java.io.File类读取过workspace中的文件,我相信在不了解eclipse目录层次结构的情况很少有人可以一次性把路径给写对了,为了避免以后再出现这种令人难堪的情况,还是编写这样一篇扫盲性的说明文档比较合适.当然重点绝不是上面的资源路径怎么编写,而是影响围绕整个工程的生命周期的构建活动. 首先看一下eclipse在默认情况下创建一个普通的Java Project的目录结构: 从上面可以看出来ecli

C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector<int>::size_type index = 0; index != 10; ++index) { iVec.push_back(index); } for (vector<int>::reverse_iterator r_iter = iVec.rbegin(); r_iter !=

C++ Primer 学习笔记_42_STL实践与分析(16)–再谈迭代器【上】

STL实践与分析 --再谈迭代器[上] 引言: 另外三种迭代器类型: 1)插入迭代器:这类迭代器与容器绑定在一起,实现在容器中插入元素的功能. 2)iostream迭代器:这类迭代器可以与输入与输出流绑定在一起,用于迭代遍历所关联的IO流. 3)反向迭代器:这类迭代器实现向后遍历,而不是向前遍历,所有的容器都定义了自己的reverse_iterator类型,由rbegin和rend成员函数返回. 上述迭代器都在iterator头文件中定义. 一.插入迭代器 前面曾经提到的back_inserte

再探Linux动态链接 -- 关于动态库的基础知识

  在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台相关目标文件这一层次)和链接(Linking,指目标文件到最终形成可执行文件这一层次),这个总的过程可称为编译时:就动态链接而言,还存在一个运行时,即程序在被操作系统加载的过程中,系统将该程序需要的动态库加载至内存到程序开始运行的这一段过程.明确这两个过程在一般linux开发中的地位,以及了解每个"