STL 之 迭代器

c++ STL标准库迭代器 摘要:本文介绍了C++ STL中的迭代器,重点讲解了反向迭代器的实现原理和使用方法。文章首先回顾了STL的基本组件,指出迭代器是访问容器元素的统一方式。然后详细阐述了反向迭代器的模板类定义、构造方法及操作符重载,展示了其与正向迭代器的对称设计。最后通过示例代码演示了反向迭代器的遍历过程,并提醒注意迭代器失效问题。反向迭代器通过重载++/--运算符实现逆向遍历,为容器操作提供了灵活的方向选择。 阅读详情

     理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分。

 

迭代器类型

 

1. 输入迭代器

     输入迭代器可被程序用来读取容器中的信息,但不一定能让程序修改值。

     输入迭代器是单向迭代器,可以递增,但不能倒退。

     对于单通行(single-pass)、只读算法,可以使用输入迭代器。

 

2. 输出迭代器

     对于单通行、只写算法,可以使用输入迭代器。

 

3. 正向迭代器

     正向迭代器只使用++操作符来遍历容器,它每次沿容器向前移动一个元素。它总是按相同的顺序遍历一系列值。另外,将正向迭代器递增后,仍然可以对前面的迭代器值解除引用(如果保存了它),并可以得到相同的值。这些特征使得多次通行算法成为可能。

 

4. 双向迭代器

     双向迭代器具有正向迭代器的所有特征,同时支持两种(前缀和后缀)递减操作符。

 

5. 随机访问迭代器

     随机访问迭代器具有双向迭代器的所有特征,同时添加了支持随机访问的操作(如指针增加运算)和用于对元素进行排序的关系操作符。


各种迭代器的类型并不是确定的,而只是一种概念性描述。
每个容器类都定义了一个类级typedef名称——iterator

下图总结了主要的迭代器功能。


迭代器性能


预定义迭代器

 

ostream_iterator迭代器

     该模板是输出迭代器概念的一个模型,它也是一个适配器(adapter)——一个类或函数,可以将一些其他接口转换为STL使用的接口。

 

     可以通过包含头文件iterator(以前为iterator.h)并做下面的声明来创建这种迭代器:
#include <iterator>
...
ostream_iterator<int,char> out_iter(cout," ");

 

     out_iter迭代器现在是一个接口,让其能够使用cout来显示信息。

     第一个模板参数(这里是int)指出了被发送给输出流的数据类型;第二个模板参数(这里是char)指出了输出流使用的字符类型(另一个可能的值是wchar_t)。

     构造函数的第一个参数(这里是cout)指出了要使用的输出流,它也可以用于文件输出的流;最后一个字符串参数是在发送给输出流的每个数据项后显示的分隔符。

 

     在老式C++实现中,只使用了ostream_iterator的第一个模板参数。

 

使用out_iter迭代器:
*out_iter++ = 15;           // works like cout << 15 << " ";

 

     上述代码将15和由空格组成的字符串发送到cout管理的输入流中,并为下一个输出操作做好了准备。

 

     还可以将该迭代器用于算法中,这里使用copy()算法:

     copy(dice.begin(),dice.end(),out_iter);

 

     前两个迭代器参数指明了要复制的区间,最后一个迭代器参数指明了要将第一个元素复制到什么位置。因此,上述代码将dice容器的整个区间复制到输出流中,即显示容器的内容。

 

     直接构建匿名迭代器作为算法参数:

     copy(dice.begin(),dice.end(),ostream_iterator<int,char>(cout," "));

 

istream_iterator迭代器

     该模板是输入迭代器概念的一个模型,同样定义在头文件iterator中。

 

     使用两个istream_iterator对象来定义copy()的输入范围:

     copy(istream_iterator<int,char>(cin),
         istream_iterator<int,char>(),dice.begin());

 

     istream_iterator也使用两个模板参数,第一个参数指出要读取的数据类型,第二个参数指出输入流使用的字符类型。

     使用构造函数参数cin意味着使用由cin管理的输入流,而省略构造函数参数表示输入失败。

     因此上述代码从输入流中读取,直到文件结尾、类型不匹配或出现其它输入故障为止。

 

reverse_iterator迭代器

     该迭代器是一个反向迭代器,对其执行递增操作将导致它被递减。

 

     通过理解vector类中的rbegin()和rend()成员函数,将有助于理解该迭代器。

 

     rbegin()返回一个指向超尾的反向迭代器,rend()返回一个指向第一个元素的反向迭代器。因为对其执行递增操作将导致它被递减,所以可以使用下面的语句来反向显示容器的内容:

     copy(dice.rbegin(),dice.rend(),out_iter);  // display in reverse order

 

     另外,必须对反向迭代器做一种特殊补偿。假设rp是一个被初始化为dice.rbegin()的反转指针。那么 *rp 是什么呢?因为rbegin()返回超尾,因此不能对该地址进行解除引用。同样,如果rend()是第一个元素的位置,则copy()必须提早一个位置停止,因为区间的结尾处不包括在区间中。

 

     综上所述,反向指针需要通过先递减,再解除引用,方可解决问题。即如果rp指向位置6,则*rp将是位置5的值。

 

范例,使用reverse_iterator迭代器反向显示vector容器的内容:
vector<int> dice(10);
...
vector<int>::reverse_iterator ri;
for (ri = dice.rbegin(); ri != dice.rend(); ++ri)
      cout << *ri << ' ';

 

back_insert_iterator迭代器

     将新元素插入到容器尾部,并使用自动内存分配来确保能够容纳新的信息。

 

     只能用于允许在尾部快速插入的容器。快速插入指的是一个时间固定的算法。具体介绍请查看<<STL 之 容器>>

 

     为名为dice的vector<int>容器创建一个back_insert_iterator迭代器:

     back_insert_iterator<vector<int> > back_iter(dice);

 

     必须声明容器类型,因为迭代器必须使用合适的容器方法。构造函数将假设传递给它的类型有一个push_back()方法。该声明让back_iter能够使用方法push_back()来自动分配内存。

 

front_insert_iterator迭代器

     将新元素插入到容器前端,并使用自动内存分配来确保能够容纳新的信息。

 

     只能用于允许在起始位置做时间固定插入的容器类型。

 

     该迭代器的声明方法与back_insert_iterator的方式相同。

 

insert_iterator迭代器

     将新元素插入到insert_iterator构造函数的参数指定的位置前面。并使用自动内存分配来确保能够容纳新的信息。

 

     该迭代器并没有什么插入算法限制,但速度往往较慢。

 

     对于insert_iterator的声明,需要一个指示插入位置的构造函数参数:

     insert_iterator<vector<int> > insert_iter (dice, dice.begin());

STL--迭代器 输入迭代器:只读,单向移动,适用于单次遍历。输出迭代器:只写,单向移动,适用于单次遍历。前向迭代器:可读可写,单向移动,适用于多次遍历。双向迭代器:可读可写,双向移动,适用于需要双向移动的场景。随机访问迭代器:可读可写,支持随机访问,适用于高效随机访问的场景。连续迭代器:可读可写,支持随机访问,元素在内存中连续存储,适用于高效随机访问且元素连续存储的场景。 阅读详情

相关推荐

C++ STL容器迭代器失效

迭代器是封装了指针、重载了 -> 、* 、++等操作符的类模板。迭代器失效,指迭代器指向错误的元素或无效的内存地址。理解迭代器失效,首先要了解容器的内部数据结构、以及该容器存储新元素和删除旧元素时的内存状态。

Hyman's Blog 3065

C++迭代器

C++迭代器的概念和ostream_iterator、istream_iterator迭代器与copy()函数的使用

南明离火的博客 1808

(篇八)C语言在母串删子串、输入位置截取子串

文章目录一、字符串二、删除指定的字符三、从母串中截取子串四、输入位置截取子串 本篇主要介绍C语言字符串中的相关操作,然后分析两个C语言实例——在母串中指定删除子串、在母串中截取子串 一、字符串 了解C 语言的都知道,C语言中没有字符串类型,所以C语言是用字符串常量、字符指针、字符数组来表示字符串。这些字符串都是以 NULL、’\0’或者ASCII==0来结尾。说白了就是一个个字符组成一串有序序列,...

Viewinfinitely的博客 1510

7.24C++:迭代器、输入/出流迭代器、迭代器分类及功能、迭代器的区间、通过迭代器排序、迭代器的辅助函数

1 迭代器 迭代器是算法和容器的桥梁 迭代器用作访问容器中的元素 算法不直接操作容器中的数据,而是通过迭代器间接操作 算法和容器独立 增加新的算法,无需影响容器的实现 增加新的容器,原有的算法也能适用 2 输入/出流迭代器 输入流迭代器 istream_iterator<T> istream_iterator<int>(cin) //以标准输入(cin)作为参数,将键盘输入int类型数据读入到输入流 以输入流(如cin)为参数构造 可用*(p++)获得下一个输入的元素 输出流迭

weixin_44478659的博客 764

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 294

SAP CKMLCP 月结7大常见报错:从“未找到成本核算运行”到“物料占用”的完整解决方案

本文深入解析SAP CKMLCP月结过程中的7大常见报错,从权限问题到数据一致性错误,提供系统化的解决方案。重点解决'未找到成本核算运行'和'物料占用'等典型问题,帮助财务人员高效完成成本核算月结,确保数据准确性。

weixin_30299709的博客 415

STL迭代器详解

文章目录1. 迭代器(iterator)是一种智能指针(smart pointer)2. 迭代器相应类型(associate types) 不同于OOP(Object Oriented Programming)将数据(datas)和行为(methods)组织在一起的思想,STL的中心思想GP(Generic Programming)在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以胶着剂将它们撮合在一起。那么之间的胶着剂就是迭代器(iterator)。

To the beyond and infinity! 2779

VCS多lib编译实战:如何高效处理Verilog模块重命名与分开编译

本文深入探讨了在复杂SoC设计中,如何利用VCS工具实现多库编译,以高效处理Verilog模块重命名与分开编译的工程难题。通过解析synopsys_sim.setup配置、Config映射机制,并提供完整的自动化脚本实战指南,帮助工程师构建健壮、可维护的编译环境,从而显著提升大型项目的编译效率和代码管理灵活性。

weixin_29169505的博客 357

【C++】迭代器iterator研究(input iterator、output iterator等)----编辑中

迭代器定义 1.迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。 (1) 每种容器类型都定义了自己的迭代器类型,如vector: vector<int>::iterator iter; 这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。 (2) 使用迭代器读取vector中的每一个元素: vector<int> ivec(10, 1); for(vector<int>::i.

我的笔记本 2920

(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

Deepracer training 流程

Rainbow 4711

信贷模型域——清收阶段模型(贷后模型)

本文深入探讨了信贷模型域中的清收阶段模型(贷后模型),涵盖早期催收模型(C卡)、晚期催收模型、Best Time to Contact模型和回收模型。这些模型通过多维度数据输入,运用分类、回归和生存分析等建模方法,输出关键指标如还款概率、回收率等,广泛应用于银行、资产管理公司和催收外包公司,助力提升回款率、优化资源分配、降低催收成本,并融入贷后风控体系。

庄小焱 652

C++ 迭代器,常用五种迭代器

C++ 迭代器,常用五种迭代器

ken2232的博客 1409

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 309

C++ STL与迭代器

将容器类模板实例化时,会指明容器中存放的元素是什么类型的:可以存放基本类型的变量,也可以存放对象。 对象或基本类型的变量被插入容器中时,实际插入的是对象或变量的一个复制品。 STL 中的许多算法(即函数模板),如排序、查找等算法,在执行过程中会对容器中的元素进行比较。这些算法在比较元素是否相等时通常用运算符进行,比较大小通常用<运算符进行,因此,被放入容器的对象所属的类最好重载==和&lt...

少说,多做。 8674

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传统电位器/编码器相比,AS5600具有显着优势:高精度、非接触式、旋转角度无限制。 所有这些优点使其适用于非接触式角度测量应用,例如机器人手臂、云台、电机闭环控制、机床轴定位。

视觉与物联智能 2550

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STL中迭代器的实现

 STL中迭代器的实现junguo           最近在看候捷先生的《STL源码剖析》,侯先生写的挺好的。但我读起来总感觉有些拗,理解起来有些费劲,可能他看问题的观点和我不一样造成的。开始的时候总是不太理解,后来理顺了自己的思路,发现有些东西其实并不难。在此把我对迭代器的理解整理一下,也是帮助自己消化一下,因为我发现不动手,很多东西容易遗忘。      文章里提供的一些例子程序是在D

junguo的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++ [STL容器反向迭代器]

我们知道STL大部分容器都有迭代器,迭代器又分为正向迭代器和反向迭代器,对于正向迭代器以及实现前面我们已经了解了不少,而反向迭代器的设计思想是适配器模式,本节我们介绍反向迭代器的实现!本节简单介绍了反向迭代器思想,将类和对象的封装意义体现的淋漓尽致,快来学习吧!

ARMCSKGT的博客 6501

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STL迭代器

1.1    STL迭代器1.1.1   STL迭代器的作用<br />迭代器是STL库实现的一个规范,巧妙的利用数学上的[ )符号,即闭区间、开区间,来表示容器所拥有的元素。<br />用户使用迭代器访问容器的元素的时候,简单、易用,可以避免许多错误。<br />代码也会显的紧凑、简洁、美观。<br />迭代器作为STL容器和算法的粘合剂,实现了数据结构和算法的分离。<br />STL库通过迭代器给用户提供访问接口,可以隐藏去多内部实现细节。<br />满足了封装性的设计要求。<br />只要用户遵守ST

hengshan的专栏 4323

STL组件之——迭代器

当然我们也可以使用非常量迭代器,这时迭代器是非常量类型的、元素类型也是非常量类型的,我们就可以对容器中的元素进行修改。所有容器类别都提供一些成员函数,使我们得以获得迭代器并以之访问所有元素,其中最重要的两个函数是。迭代器是一个”可遍历STL容器内全部或部分元素“,一个迭代器用来指出容器中的一个特定位置。返回一个迭代器,指向容器起始点,也就是第一元素的位置;返回一个迭代器,指向容器最后一个元素的下一个位置;operator==和operator!这里我们将上一个程序的输出全部变为大写。

yangSHU21的博客 1691

STL迭代器原理

参考C++ STL迭代器原理和实现 迭代器 STL(Standard Template Library)中提供了许多容器,包括vector、list、map、set等,少部分容器(vector)可以通过下标来访问其中的元素,而大部分的容器都不可以这么做,为了能够以一种统一的方式来访问STL的所有容器,STL提供了迭代器访问的方式,它的实现方式是在每个容器类中内嵌了一个专属的iterator类,在iterator类中实现了对该容器的元素的遍历和访问。 通过在所有容器类中实现iterator,就可以很方便地实现

zhongzhh8的博客 1427

STL 与 迭代器

迭代器(Iterator)是一种用于访问容器(如数组、链表、向量等)中元素的对象。它的工作原理类似于指针通过迭代器可以在容器中遍历、访问元素,而不需要关心容器的底层实现方式。(因为迭代器的操作是如此的基础,因此标准库中的每一种容器都是符合的)在 C++ 中,迭代器是一种抽象化的工具,提供了一种统一的方式来遍历标准库容器,例如vectorlistdequeset等。这使得代码更具通用性,可以在不修改代码的情况下应用于不同类型的容器。

haoloved的博客 1170

STL迭代器的基础应用

迭代器的定义方法:| 类型 | 作用 | 定义方式 || 正向迭代器 | 正序遍历STL容器 || 常量正向迭代器 | 以只读方式正序遍历STL容器 || 反向迭代器 | 逆序遍历STL容器 || 常量反向迭代器 | 以只读方式逆序遍历STL容器 |迭代器与自动类型推导:C++11引入了auto。

椰萝Yerosius,开源运动支持者,主要研究计算机科学、人工智能、Linux系统、数据结构与算法。 2120

STL——迭代器

1,因为Iterator要模拟指针,STL中除了vector和array中的Iterator之外,其他容器的指针都是一个类,因为Iterator需要模拟指针,又因为指针需要大量的+-*/操作,因此Iterator里面必然具有大量的运算符重载。 2,Iterator_traits的作用是把迭代器的特征萃取出来。例如Iterator_traits<_Iter>::iterator_cat...

一个小孩 242

C++之STL迭代器

一、背景 迭代器(iterator)是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器。除此之外,STL中迭代器一个最重要的作用就是作为容器(vector,queue等)与STL算法的粘结剂,只要容器提供迭代器的接口,同一套算法代码可以利用在完全不同的容器中,这是抽象思想的经典应用。 以find函数为例 template <class _InputIter, class _Tp> inline _InputIter find(_InputIter __first,

sinat_31608641的博客 1071

STL 2迭代器

2.统一接口:通过迭代器,算法可以操作任意容器(如 vector、list、map),无需关心容器的底层实现。1.双向迭代器的全部操作:自增(++)、自减(–)、解引用读写(*it、*it = value)。1.前向迭代器的全部操作:自增(++)、解引用读写(*it、*it = value)、多次遍历。2.随机位置跳转:支持 +=、-=、+、- 操作(如 it += 5 直接跳到第 5 个位置)。1.输入迭代器的全部操作:自增(++)、解引用读取(*it)、相等比较(==/!

qq_42974718的博客 755
上一篇: STL 简介
下一篇: STL 之 容器
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值