自修C++Primer----3.4迭代器(iterator)的介绍

2024-08-26 23:04

本文主要是介绍自修C++Primer----3.4迭代器(iterator)的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.迭代器的使用

 1.1迭代器运算符

1.2从一个元素指向下一个元素

1.3迭代器的类型

1.4begin和end操作符

1.5解引用操作符和成员访问

1.6引入迭代器失效

1.7全部改成大写的一个练习

2.使用迭代器运算


我们可以使用下标运算符访问string里面的字符或者是这个vector里面的元素,另外还有一种简单的机制可以实现这个效果,就是迭代器;

迭代器和类似于我们之前学习的指针,迭代器提供了我们对于这个对象的间接访问,它的对象可以是这个string里面的字符或者是vector等容器里面的元素,迭代器可以去访问某一个元素,也可以从某一个元素指向另一个元素;

和指针一样,迭代器有有效和无效之分,有效的迭代器指向某一个元素或者是尾部元素的下一个位置,其他的都是无效的;

1.迭代器的使用

和指针不一样的是这个迭代器不需要有取地址符,这个迭代器是有类型的,同时返回这个迭代器的成员,例如我们经常使用的这个begin和end函数,返回的就是迭代器;

begin()函数返回的是指向第一个字符或者元素的迭代器;

end()函数返回的是指向最后一个元素下一个位置的迭代器;

ch1实际上就是一个迭代器,我们使用auto进行这个类型的识别,这个类型是由编译器决定的,iteartor实际上是一种迭代器的类型,这个我们后面会讲到,begin返回的ch1这个迭代器指向v里面的第一个字符;

ch2也是一个迭代器,指向这个v里面的最后一个字符的下一个位置(不存在的字符),这个没有什么实际含义,就是为了表明我们已经处理完这个容器里面的所有的元素,因此这个ch2迭代器叫做尾后迭代器;

 1.1迭代器运算符

第一个返回这个迭代器的指向元素;

第二个这个写法就是我们的结构体里面常用的写法,先是解引用找到这个对象,然后去找到这个对象对应的成员变量;

++,--操作就是通过这个移动指向前面的或者是后面的一个元素;

最下面的两个运算符是用来进行判断两个迭代器是否一样,一样的话就是两个迭代器指向的元素一样,或者都是尾后迭代器,否则就是不一样的;

下面这个我们就是通过迭代器的解引用操作符把这个字符串的第一个字符变为大写的字符,toupper就是把这个字符的小写变成大写的;

1.2从一个元素指向下一个元素

下面这个就是通过这个iterator++操作,实现这个迭代器从一个元素指向另一个元素,isspace用来判断这个字符是不是一个空白字符,是的话返回true,我们这个循环条件里面使用这个就是为了说明我们判断的时候遇到空白字符就会停止;

1.3迭代器的类型

实际上,我们不会精确的指导迭代器的类型,但是在那些拥有迭代器的标准库类型里面使用iterator和const_iterator表示这个迭代器的类型;

const_iterator是常量指针,表示的意义是只读不能写,常量的话只能使用const_iteartor迭代器,普通类型的话两个迭代器都可以使用;

1.4begin和end操作符

begin和end的具体的返回类型是有这个对象是否是常量决定的,我们下面的这个v对象,就是一个普通对象,所以使用v调用这个begin函数的返回值就是iterator类型的迭代器;

我们定义的这个cv就是一个const常量,因此使用这个cv调用begin函数的返回值就是const_iterator类型的;

为了方便我们得到const_iterator迭代器,我们的C++11里面引入了cbegin和cend函数,这个函数的返回值就是const_iterator迭代器,无论这个对象是常量还是普通对象;

1.5解引用操作符和成员访问

我们下面的这个就是想要说明两个方法都可以获得这个it指向的内容,判断这个内容是不是空的,我们可以使用第一种直接it->empty的方式,也可以使用第二种,两个的方式是等效的;

 

1.6引入迭代器失效

这里我们只是简单看一下,后面还会继续学习,已知的一个限制就是不可以在范围for里面向这个vector里面添加元素,另外这个使用push_back()函数,改变vector对象的容量就会让这个迭代器失效,后面我们还会遇到,这个地方知识提及一下;

凡是使用了迭代器的循环体,都不要向这个迭代器所属的容器里面添加元素;

1.7全部改成大写的一个练习

这个地方应该如何进行正确的理解呢,就是这个vector容器里面的每一个都是string对象,相当于是一个二维数组,先是去获得这个string对象,再获得这个对象里面的每一个字符元素;

我们这个题目是想要把我们输入到这个vector里面的string对象的元素全部转换为大写的,这个时候,我们第一步就是使用这个while循环和这个getline获得对应的这个字符串的输入;

下面分别是一个操作的嵌套循环和打印输出的单层循环;

嵌套循环的第一层就是获得这个vector里面的每一个string对象,这个判断条件里面使用这个empty函数表明这个string不可以是空的,第二层for循环就是对于每一个*it(就是我们的string对象)操作,获得这个string里面的每一个字符并且变成大写的,这个循环就没有empty函数了;

为什么这个外层循环有这个empty函数,但是这个内层循环没有empty函数呢?

这个empty函数是针对于这个string进行判断的,string对象调用这个函数判断这个对象是不是空的,但是对于string里面的元素字符,不需要进行这个empty函数的调用,这个也是不允许的;

2.使用迭代器运算

下面的这个公式我们有必要记一下,就是这个一组数据的中间元素的下标的获得方法:

v.begin()+v.size()/2进行计算,下面的这个二分查找里面就有使用到这个式子查找中间节点

二分查找,保证这个容器里面的数据是有序排列的,这个是进行下面的二分查找的前提条件;

mid的计算就是使用的上面说的那个式子,soughu就是我们想要寻找的元素,其他的都是判断这个我们要找的sought是比这个中间节点大还是小,大的话就把这个左区间换掉,小的话就是把这个右边换掉,并且每一次都要更新这个节点;

对于下面的这个问题:

我们的beg,end都是调用函数返回的迭代器,迭代器类似于指针,我们可以使用指针的减法表明两个位置之间的元素的个数,但是不可以做加法,因此下面的这个问题里面的另外一个写法是不被允许的;

这篇关于自修C++Primer----3.4迭代器(iterator)的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109938

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,