10.4 再探迭代器
admin
2024-05-14 03:22:11
0

文章目录

    • 插入迭代器
      • 插入迭代器的三种模式
    • iostream迭代器(流迭代器)
      • istream_iterator 操作
      • ostream_iterator 操作
    • 反向迭代器
    • 移动迭代器

除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种:

  1. 插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素。
  2. 流迭代器: 这些迭代器被绑定到输入或输出流上,可用来遍历所关联的I0流。
  3. 反向迭代器: 这些迭代器向后而不是向前移动。除了forward_ list之外的标准库容器都有反向迭代器。
  4. 移动迭代器: 这些专用的迭代器不是拷贝其中的元素,而是移动它们。我们将在后面的13.6.2处进行详细介绍。

插入迭代器

绑定到容器中,用来向容器插入元素;

插入迭代器是一种迭代器适配器,接受一个容器生成迭代器,实现向给定容器添加元素。

相关的操作:

it= t; //在it指定位置插入值t
*it,++it,it++ //返回it

插入迭代器的三种模式

插入迭代器说明
back_inserter类似于使用c.push_back(val);
front_inserter类似于使用c.push_front(val);
inserter类似于使用 it = c.inserter(it,val);++it;元素被插入到给定迭代器之前的元素的地方

只有在容器支持push_ front(forward_list、list、deque)的情况下,我们才可以使用front_ inserter。类似的,只有在容器支持push_back(vector deque string)的情况下,我们才能使用back_ inserter.

样例:

	vector strs = { "hhdy","ssssdfg","asdcfgd","hh","xx","hhdyzwhy" };auto it = inserter(strs, strs.begin()+1);it = "abs";//hhdy abs ssssdfg asdcfgd hh xx hhdyzwhyauto it1 = back_inserter(strs);*it1 = "hhh";  //it和*it=val都可以//hhdy abs ssssdfg asdcfgd hh xx hhdyzwhy hhhvector strs1;copy(strs.begin(), strs.end(), inserter(strs1, strs1.begin()));//hhdy abs ssssdfg asdcfgd hh xx hhdyzwhy hhhlist strs2;copy(strs.begin(), strs.end(), front_inserter(strs2));//hhh hhdyzwhy xx hh asdcfgd ssssdfg abs hhdyvector strs3;copy(strs.begin(), strs.end(), back_inserter(strs3));//hhdy abs ssssdfg asdcfgd hh xx hhdyzwhy hhhvector strs4;copy(strs.begin(), strs.end(), inserter(strs1, strs4.begin()));//hhdy abs ssssdfg asdcfgd hh xx hhdyzwhy hhh//此处和strs2进行对比,看看有什么不同。

iostream迭代器(流迭代器)

虽然iostream类型不是容器,但标准库定义了可以用于这些IO类型对象的迭代器。istream_iterator 读取输入流,ostream_ iterator 向一个输出流写数据。这些迭代器将它们对应的流当作一个特定类型的元素序列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。

istream_iterator 操作

操作说明
istream_iterator in(is);in从输入流is中读取T类型的数据,in实际上相当于此段迭代器中的begin
istream_iterator end;读取类型为T的istream_iterator尾后迭代器,相当于此段迭代器中的end
in1 == in2in1和in2都是尾后迭代器或者绑定到相同的输入(前提二者都是读取T类型的数据)
in1 != in2非上面的描述即此描述
*in返回从流中读取的数据
in->mem等效于(*in).mem
++in,in++使用元素类型所定义的>>运算符从输入流中读取的下一个值。

常见用法1:
从cin读取int值存入vec

//从cin读取int值存入vecvector vec;istream_iterator int_it(cin),int_eof;while (int_it != int_eof) {vec.push_back(*int_it++);}//相当于下方代码istream_iterator in_iter(cin), eof;vector vec(in_iter, eof);

常见用法2:
从文件流读取string存入vecstr

	ifstream in("文件地址");istream_iterator str_int(in),str_eof;vector vecstr;while (str_int != str_eof) {vecstr.push_back(*str_int++);}

常见用法3:
使用泛型算法操作流迭代器

	istream_iterator intit(cin), inteof;cout<

ostream_iterator 操作

可以对任何具有输出运算符(<<)的类型定义ostream_iterator。

ostream_iterator必须绑定到一个指定的流,不允许空的或表示尾后位置的ostream_iterator。

ostream_iterator 操作说明
ostream_iterator out(os);out将类型T的值写入输出流os中
ostream_iterator out(os,d);out将类型T的值写入输出流os中,每个值后都输出一个d。d指向一个空字符结尾字符数组。
out = val用<<运算符将val写入到out绑定输出流os中。
*out,++out,out++不对out做任何事,返回out

常用用法1:
输出

	vector vec{ 1,2,3,4,5 };ostream_iterator out(cout, " ");for (int i : vec){out = i;//*out++ = i;//功能和上面的一致。}cout << endl;

常用用法2:
通过泛型函数打印输出

	ostream_iterator out_iter(cout, " ");copy(vec.begin(), vec.end(), out_iter);cout << endl;

常用用法3:
使用流迭代器处理类:
待补。

反向迭代器

反向迭代器是在容器从尾元素向首元素反向移动的迭代器。反向迭代器++it会移动到前一个元素,- -it会移动到后一个元素。
由于反向迭代器需要递减运算符,所以除单向链表和流迭代器外可以使用。

c.rbegin(),c.crbegin(),c.rend(),c.crend()

常用的方式1:
逆序输出:

	vector vec = { 1,2,3,4,5 };ostream_iterator outer_vec(cout, " ");copy(vec.rbegin(), vec.rend(), outer_vec);  //5,4,3,2,1cout<cout << *iter << " "; //5,4,3,2,1}cout << endl;

常用的方式2:
逆序排序:

sort(vec.rbegin(),vec.rend());

常用的方式3:
输出逗号分割列表中倒数第一个单词

由于普通迭代器是左闭右开,反向迭代器是左开右闭。二者不能混合使用。从一个普通迭代器初始化一个反向迭代器,或是给一个反向迭代器赋值时,结果迭代器和原迭代器指向的不是同一个元素。
可以使用reverse_iterator的base函数,使反向迭代器返回对应的普通迭代器。

	string words = "hhdy,zwhy,hhdyzwhy";auto lword_iter = find(words.rbegin(), words.rend(), ',');cout << string(words.rbegin(),lword_iter) << endl; //yhwzydhh //为什么不用下面的那个格式呢?//原因在于lword_iter是从逆向过来的,所以他是一个反向迭代器,意味着他会反向的处理string,导致无限循环,在此处卡住。cout << string(lword_iter,words.rbegin())<

移动迭代器

不拷贝其中元素,而是移动他们。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...