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

news2024/12/26 0:04:45

目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈二分算法

浅谈二分算法 二分 首先知道一下二分是什么。 二分,是一种快速处理大型数据的方法。基本逻辑是折半查找。 设有一个共有 n n n 个数字的数组,要从中查询某个元素,就可以用二分查找。 注:这里的数组默认其成员数值具有单调性…

C++类和对象(总篇)

文章目录 C类和对象1、类的定义1.1类定义格式1.2访问限定符1.3类域 2、实例化2.1实例化概念 3、this指针4、类的默认成员函数5、构造函数5.1构造函数的特点5.2实例分析 6、析构函数6.1析构函数的特点6.2实例分析 7、拷贝构造函数7.1 拷贝构造函数的特点7.2实例分析7.3浅拷贝和深…

Linux中断管理

Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。 1.Linux中断简介 中断号 每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变…

神经网络—卷积层

1.讲解 Conv2d out_channels 参数为2时,会生成两个卷积核,分别与输入进行卷积。得到的两个输出为输出 新生成的卷积核和原来的卷积核不一定相同 in_channels (int) – Number of channels in the input image out_channels (int) – Number of channels…

Marching Cubes 算法再探

Marching Cubes 算法再探 基础过程代码mian.cppMarchingCubes.hMarchingCubes.cpp 之前做NeRF相关工作时简单看过,但没有深究其实现,知其然不知其所以然的程度,算是初探。 基础 为了对MC有大致了解,可以先根据Marching Cubes 算法…

两个实用的Python编程技巧

一、变量类型声明技巧 虽然在Python中可以不用声明变量的类型,但是为了加快程序的运算速度,减少不必要的bug,我们可以在定义变量之初就把它的类型确定,这样可以更好地传输变量值。如下面的例子。 我们定义了两个变量&#xff0c…

IO进程线程 240826作业

作业 创建3个进程,子进程1拷贝文件的前一半,子进程2拷贝后一半文件,父进程回收两个子进程资源。 将1.txt内容拷贝到2.txt中 #include <myhead.h> int main(int argc, const char *argv[]) {pid_t pid1;pid1 fork();int fd1 open("./1.txt",O_RDWR);if(fd1…

JavaWeb JavaScript ④ JS的对象和JSON

只要你的风格是适应客观规律的&#xff0c;那你以后会越来越好&#xff0c;做事情会越来越顺利 —— 24.8.26 一、JS创建对象 语法 方式1 new Object() 方式2 {属性名&#xff1a;属性值&#xff0c;… …&#xff0c;函数名&#xff1a;function(){}} 方式…

Python | Leetcode Python题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; MASK1 4294967296 # 2^32 MASK2 2147483648 # 2^31 MASK3 2147483647 # 2^31-1class Solution:def getSum(self, a: int, b: int) -> int:a % MASK1b % MASK1while b ! 0:carry ((a & b) << 1) % MASK1a (a ^ b) % MA…

Agent实际落地的应用 未来生活的无形助手

在这个信息爆炸的时代&#xff0c;我们每个人都在追求更高效的生活方式。想象一下&#xff0c;如果有一个无形的助手&#xff0c;能够理解我们的需求&#xff0c;自动处理繁琐的任务&#xff0c;甚至为我们提供个性化的建议&#xff0c;那将是多么美好的体验&#xff01;这正是…

线性DP经典题型

数字三角形&#x1f342; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;vector<vector<int>>arr(n1,vector<int>(n1,0));for(int i 1;i<n;i){for(int j 1;j<i;j){cin>>arr[i][j];}}vector<vector<i…

【精选】分享9款AI毕业论文生成初稿题目网站

在当今学术研究领域&#xff0c;AI技术的应用日益广泛&#xff0c;尤其是在学术论文的撰写过程中。AI论文生成器的出现&#xff0c;极大地简化了学术写作流程&#xff0c;提高了写作效率。以下是9款推荐的AI毕业论文生成初稿的网站&#xff0c;它们各有特色&#xff0c;能够满足…

【Qt】多元素控件QTableWidget

多元素控件QTableWidget 使用QTableWidget表示一个表格控件&#xff0c;一个表格中包含若干行、每一个行又包含若干列。 表格中的每一个单元格&#xff0c;都是一个QTableWidget对象。 QTableWidget核心方法 方法说明 item(int row, int column) 根据⾏数列数获取指定的 Q…

【电路笔记】-运算放大器基础

运算放大器基础 文章目录 运算放大器基础1、概述2、运算放大器表示3、开环增益(Open-Loop Gain)4、输入和输出阻抗5、带宽6、偏移电压7、理想运算放大器模型7.1 饱和模式7.2 线性模式8、实际运算放大器9、总结1、概述 本文将介绍运算放大器(也称为运算放大器,Operational …

HandBrakeCLI 压缩工具的简单实用

HandBrakeCLI -i input.mp4 -o output.mp4 --encoder qsv_h264 -b 500k --preset "Android 576p25" --width 320 --height 576 --quiet--encoder qsv_h264 意思代表inter的gpu编码 -b 500k 设置比特率 --preset "Android 576p25" 设置预设 --width 320 --…

揭秘OTP与MTP:你的存储小秘密,一次性和多次可编程大不同!

NVM,即非易失性存储器,是一种非易失性内存。 NVM的特点是存储的数据在断电后不会消失。传统的NVM,如掩模ROM、可编程ROM(PROM)、可擦除可编程ROM(EPROM)、电可擦可编程ROM(EEPROM)、NAND/NOR闪存等,以及目前正在开发的许多新型状态存储器,如磁性存储器(MRAM)、电…

Jar包导入本地maven仓库

当jar包未引入到公共maven仓库时&#xff0c;直接通过maven坐标的方式引入会报错&#xff0c;找不到该依赖。所以可以将jar包导入到本地maven仓库&#xff0c;再通过maven坐标引入后就没有问题。 mvn install:install-file -Dfilexxxxxx.jar -DgroupIdcom.xx -DartifactIdxxxx…

idea debug 各个步骤含义

基本功能 IntelliJ IDEA 的 Debug 功能提供了强大的调试支持&#xff0c;允许开发者逐步执行代码&#xff0c;检查变量值&#xff0c;评估表达式等。以下是 Debug 模式中常见的几个按钮及其含义&#xff1a; Show Execution Point (显示执行点)&#xff1a;将光标跳转到当前正在…

如何使用ssm实现模具制造企业订单跟踪管理系统+vue

TOC ssm256模具制造企业订单跟踪管理系统vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

编程仙尊——深入理解指针(1)

目录 1.认识指针 2.指针变量和地址 2.1取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解引用操作符 2.3 指针变量的大小 3.指针类型的意义 3.1指针的解引用 3.2 指针-整数 3.3 void*指针 1、认识指针 在生活中&#xff0c;一栋楼的每个房间都会有房间号 …