C++ STL 迭代器失效

news2024/11/25 12:49:25

一、学习资料
STL迭代器的使用

二、vector容器获取值是下标法和at()的区别

vector<int> vA;
int array[]={0,1,2,3,4};
vA.assign(array,array+5);
cout<<vA[6]<<endl;
cout<<va.at(6)<<endl;

如上述代码,当使用vA[6]的方式出现访问越界时,依然能得到一个结果,而使用at(6)的方式时程序就会抛出一个数组越界的异常,所以为了及时发现程序错误,访问容器内容时推荐使用at()的方式。

三、迭代器的使用
STL中有vector/list/queue/stack等多种容器,每种容器都有特有的访问方式,这是不利于我们记忆和使用的。迭代器的出现就是为了提供一套统一的STL访问方式,提高编程的效率。
使用方法:
1.声明(以vector为例): vector<int>::iterator it; 声明一个vector类型的迭代器
2.定义:
it=vA.begin(); 让迭代器指向vA的第一个元素位置
it=vA.end(); 让迭代器指向vA的最后一个元素位置的下一个位置
【易错点注意:end()是最后一个元素位置的下一个位置(如下图)】

在这里插入图片描述
3. 获取当前迭代器对应位置的元素
迭代器可以理解为一个指针,要获取迭代器所指位置的元素,就可以像指针一样加一个解引用符*(迭代器重载了该运算符),那么想要通过迭代器输出容器中每一个元素就可以通过迭代器自增来遍历

vector<int> vA;
int array[]={0,1,2,3,4};
vA.assign(array,array+5);
vector<int>::iterator it;
for(it=vA.begin();it!=vA.end();it++){
    cout<<*it<<endl;
}
  1. 迭代器可以通过it=it+n来访问容器中的任意元素
it=vA.begin();
it=it+3;
cout<<*it<<endl;

四、插入和删除时迭代器失效
1.
intsert(it,p): 在当前迭代器it指向的位置插入一个元素,内部逻辑:当前位置和后面每一个元素都往后移一位,然后将要插入的值p写入当前位置。
erase(it): 删除迭代器it所指位置的元素,内部逻辑:当前位置后的每一个元素向前移动一个位置,于是当前位置元素被覆盖掉,就相当于删除了。
【注:无论是插入和删除,it指向的位置始终没变,只是相应位置的元素发生了变化】

当使用insert()函数进行容器元素插入或者使用erase()函数进行删除操作时可能导致迭代器失效!

vector<int> vA;
int array[]={0,10,22,33,40};
vA.assign(array,array+5);

vector<int>::iterator it=vA.begin()+4; //此时迭代器指向的是40这个元素的位置
vA.insert(it,8);
cout<<*it<<endl;

上面这段代码就是在下标为4的位置插入一个元素8,插入之后vA内部就应该是{0,10,22,33,8,40},迭代器的位置没有发生变化,那它指向的位置就是元素8所在的位置,以上逻辑看似没什么问题,但是在有些编译器里是编译不通过的,这是为什么呢?
考虑一下vector容器的内存管理方式,vector内元素是连续存储的,当增加一个元素,而当前位置已经没有空间容纳新的元素时,就会另外开辟一段新的空间将vector整个迁移过去,并且释放掉当前占用的空间。看上述代码,it指向的那块空间可能已经释放掉了,所以再执行cout就会报错。
那么怎么解决呢?
insert()它是有返回值的,并且它返回的就是新内存空间中元素8对应的迭代器地址,所以我们只需将上述vA.insert(it,8)修改成it=vA.insert(it,8),这就表示it指向了新的内存空间中正确的位置,这个问题就解决了。
erase()函数同理,一定要接收返回值。

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

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

相关文章

EASYX播放音频文件

添加winmm.lib的依赖 选中链接器中的输入选项&#xff1a;添加附加依赖项winmm.lib并且应用即可 添加音频相关代码 #include <easyx.h> #include <stdio.h> #include <math.h> // 宏定义 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define MAX_…

K8s学习笔记——资源组件篇

引言 前一篇文章我们介绍了K8s的概念理解和常用命令&#xff0c;这篇我们重点介绍K8s的资源组件和相关配置使用。 1. Node & Pod Node: 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。为了管理 Pod&#xff0c;每个 Node 节点上至少要运行…

剖析 Tomcat 线程池与 JDK 线程池的区别和联系

文章目录 引言JDK 线程池Tomcat 线程池Tomcat 连接器Tomcat 的 ExecutorTomcat 线程池配置 区别和联系区别联系 结论 &#x1f389;欢迎来到Java面试技巧专栏~剖析 Tomcat 线程池与 JDK 线程池的区别和联系 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a…

qt报错permission denied

写fk项目的时候&#xff0c;报这个错&#xff0c;然后网上查&#xff0c;说的是因为之前运行的qt进程没有关闭&#xff0c;然后我在任务管理器上查看&#xff0c;却没有看见有我正在运行的qt程序&#xff0c;我再出现清除 qmake也不可以&#xff0c;然后我再去删除out目录下的所…

软件提示msvcp110.dll丢失的5个修复方法,快速解决dll丢失问题

你是否曾遇到过msvcp110.dll文件丢失的情况&#xff1f;msvcp110.dll是Microsoft Visual C 2012运行时库中的一个动态链接库文件&#xff0c;它是Visual Studio 2012编译的程序所必需的。它包含了许多C标准库函数的实现&#xff0c;如字符串处理、数学运算等。当我们运行一个程…

C# 文件 文件夹 解除占用

文件/文件夹 解除占用或直接删除。 编程语言&#xff1a;C# 这个就不用过多功能描述了。 注册windows 文件/文件夹 右键菜单。 文件夹解除占用&#xff1a;遍历文件夹所有文件&#xff0c;判断是否被占用&#xff0c;先解除文件占用&#xff0c;后解除文件夹占用&#xff0…

Pikachu(一)

暴力破解 Burte Force&#xff08;暴力破解&#xff09;概述 “暴力破解”是一攻击手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高…

uni-app学习笔记

目录 一、前期准备 1、项目认识 2、pages.json基本配置 3、创建页面 二、tabBar 1、获取图标 2、代码配置 三、基础认识 1、页面生命周期 2、App.vue应用生命周期 四、基础组件 1、scroll-view可滚动视图区域 2、提示框 3、swiper滑块视图容器 4、form表单组件 一…

第 370 周赛 100112. 平衡子序列的最大和(困难,离散化,权值树状数组)

太难了&#xff0c;看答案理解了半天 题目的要求可以理解为 nums[ij] - ij > nums[ii] - ii &#xff0c;所以问题化为求序列 bi nums[i] - i 的非递减子序列的最大元素和需要前置知识&#xff0c;离散化&#xff0c;树状数组离散化&#xff1a;将分布大却数量少(即稀疏)的…

【嵌入式框架】搭建调试输出、建立时间系统

一、Zorb简介 Zorb Framework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。 搭建Zorb Framework的目的是为在不能运行Linux的芯片上快速开发应用&#xff0c;不用反复造轮子。 Zorb Framework的初步设计功能有&#xff1a; 1、时间系统功能zf_time 2、环形缓冲…

微信小程序获取openid

1.需要小程序中调用 wx.login获取临时code值&#xff08;每次获取的code值只能用一次&#xff09; wx.login({success (res) {console.log(res)} }) 打印结果为&#xff1a; 2.调用微信提供的apid接口&#xff0c;获取openid&#xff0c;入参需要三个参数&#xff1a;AppID(小…

SPSS单因素方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 用户输入和字符串格式化指南

Python 允许用户输入数据。这意味着我们可以向用户询问输入。在 Python 3.6 中&#xff0c;使用 input() 方法来获取用户输入。在 Python 2.7 中&#xff0c;使用 raw_input() 方法来获取用户输入。以下示例要求用户输入用户名&#xff0c;并在输入用户名后将其打印在屏幕上&am…

Prometheus接入AlterManager配置企业微信告警(基于K8S环境部署)

文章目录 一、创建企业微信机器人二、配置AlterManager告警发送至企业微信三、Prometheus接入AlterManager配置四、部署PrometheusAlterManager(放到一个Pod中)五、测试告警 注意&#xff1a;请基于 PrometheusGrafana监控K8S集群(基于K8S环境部署)文章之上做本次实验。 一、创…

IDEA快捷键总结+常识积累

&#xff08;一&#xff09;常用快捷键总结 以下快捷键输入完成后按Tab键即可。 1、输入main public static void main(String[] args) {}2、输入sout System.out.println();3、输入fori for (int i 0; i < ; i) {}4、输入foreach&#xff08;增强for循环快捷键&#x…

CMake引用QT、CMake构建一个转换为3d tile的开源代码

在CMake里单独运行一下 find_package(Qt5 REQUIRED COMPONENTS Core Xml Test) ,Core Xml Test 这三个是需要的qt组件; 情况如下;提示找不到QT; 根据资料,cmake引用qt需要3-4个方面, 首先Qt包含三个编译工具:moc、uic、rcc, moc:元对象编译器(Meta O…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志&#xff0c;我相信这对大家很熟悉吧&#xff0c;大家也都经常看电子杂志吧。它和我们的生活紧密相关&#xff0c;也极大地改变了我们的阅读方式。听到这“翻页电子杂志”&#xff0c;是不是觉得制作起来肯定很难很复杂&#xff0c;需要专业的人才能制作呢&#xf…

2023 年最值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…