C++ STL迭代器失效问题

【面试题】【C++】请你说说迭代器失效原因,有哪些情况 对容器的操作影响了元素的存放位置,称为迭代器失效。 阅读详情

1. 问题背景

在STL里面的容器往往封装了迭代器。迭代器能让人很方便的拿到容器里面的元素进行操作。然而,在不同结构的容器中,删除一个迭代器可能会引发迭代器失效的问题。下面针对不同的容器类型做一下总结。

太长不看版本:

  1. 对于数组型容器(vector、deque),删除一个迭代器会迫使该迭代器后面的元素往前移动,因此删除的迭代器之后的所有迭代器都会失效。但是在使用erase函数删除迭代器之后会返回下一个有效的迭代器,拿这个迭代器更新即可。

  2. 对于关联式容器(set、map、multiset、multimap),删除一个迭代器只会导致当前的迭代器失效,后面的迭代器可以正常使用。因此,使用erase 得到下一个迭代器或者是使用erase(it++)均可以更新迭代器。

  3. 对于 链表型容器(List),删除一个迭代器只会导致当前的迭代器失效,后面的迭代器可以正常使用。因此,使用erase 得到下一个迭代器或者是使用erase(it++)均可以更新迭代器。

以下是迭代器失效的场景和解决方法。

2. 数组型容器(vector、deque)

#include <vector>
#include <deque>
#include <map>
#include <unordered_map>
using namespace std;


void insert(vector<int>& nums) {
	for (int i = 0; i < 10; ++i) {
		nums.push_back(i);
	}
}

int main() {
	vector<int> nums;
	insert(nums);

	for (auto it = nums.begin(); it != nums.end(); ++it) {
		if (*it < 3) {
			nums.erase(it);
		}
	}
	cout << "-----------------------" << endl;
	for (auto it = nums.begin(); it != nums.end(); ++it) {
		cout << *it << " " << endl;
	}
}

在删除后迭代器失效:
在这里插入图片描述

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <map>
#include <unordered_map>
using namespace std;


void insert(vector<int>& nums) {
	for (int i = 0; i < 10; ++i) {
		nums.push_back(i);
	}
}

int main() {
	vector<int> nums;
	insert(nums);

	/*
	迭代器失效的错误使用:
	for (auto it = nums.begin(); it != nums.end(); ++it) {
		if (*it < 3) {
			nums.erase(it);
		}
	}
	*/
	for (auto it = nums.begin(); it != nums.end();) {
		if (*it < 3) {
			it = nums.erase(it);
		} else {
			++it;
		}
	}
	cout << "-----------------------" << endl;
	for (auto it = nums.begin(); it != nums.end(); ++it) {
		cout << *it << " " << endl;
	}
}

迭代器正确的更新方式:

在这里插入图片描述

这里由于erase函数在调用之后会返回下一个迭代器,因此不用++,相当于自动移动到下一个迭代器了。

3. 关联式容器(set、map、multiset、multimap)

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <map>
#include <set>
#include <unordered_map>
using namespace std;

void insert(set<int>& hash) {
	for (int i = 0; i < 10; ++i) {
		hash.insert(i);
	}
}

int main() {
	set<int> hash;
	insert(hash);

	for (auto it = hash.begin(); it != hash.end(); ++it) {
		if (*it < 3) {
			hash.erase(it);
		}
	}
	for (auto it = hash.begin(); it != hash.end(); ++it) {
		cout << *it << " " << endl;
	}
	
}

在这里插入图片描述

正确的使用方式:

在这里插入图片描述

4. 链表型容器(List)

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <map>
#include <set>
#include <unordered_map>
using namespace std;

void insert(list<int>& Lst) {
	for (int i = 0; i < 10; ++i) {
		Lst.push_back(i);
	}
}

int main() {
	list<int> Lst;
	insert(Lst);

	for (auto it = Lst.begin(); it != Lst.end(); ++it) {
		if (*it < 3) {
			Lst.erase(it);
		}
	}
}

在这里插入图片描述

正确的使用方式:

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <map>
#include <set>
#include <unordered_map>
using namespace std;

void insert(list<int>& Lst) {
	for (int i = 0; i < 10; ++i) {
		Lst.push_back(i);
	}
}

int main() {
	list<int> Lst;
	insert(Lst);

	//for (auto it = Lst.begin(); it != Lst.end(); ++it) {
	//	if (*it < 3) {
	//		Lst.erase(it);
	//	}
	//}

	for (auto it = Lst.begin(); it != Lst.end();) {
		if (*it < 3) {
			it = Lst.erase(it);
		} else {
			++it;
		}
	}

	for (auto it = Lst.begin(); it != Lst.end(); ++it) {
		cout << *it << " " << endl;
	}

}

运行结果:

在这里插入图片描述

C++|迭代器失效问题 谈谈迭代器失效问题 我们先来看看一个很经典的问题。 //在一个vector<int> vc中,删除所有target元素 void func1(vector<int>& vc, int target) { for (auto it = vc.begin(); it != vc.end(); it++) { if (*it == target) { it = vc.erase(it); } } } int main() { vector<int> 阅读详情

相关推荐

531-C++迭代器失效问题及解决方法

为什么方式都是一样?因为迭代器遍历完当前元素跳到下一个元素,底层数据结构的具体的遍历方式都封装在这个迭代器的++运算符函数了。 所以,作为使用方,我们不需要知道底层的数据结构原理。 我们只知道底层数据元素的遍历都封装在++运算符重载函数里面。 迭代器一般实现成容器的嵌套类型 只有容器底层数据结构内存是连续的,才提供[]运算符的重载 对于vector来说,我们可以通过[]运算符重载函数遍历访问容器,也可以定义迭代器访问容器,也可以使用for_each访问容器 ...

LINZEYU666的博客 1307

详谈C++之迭代器失效

详细讲述迭代器失效

m0_62126248的博客 1037

C++中STL中vector和list的迭代器失效问题

C++ 中vector和list是我们常用的容器,在容器配合算法的时候,就用到了迭代器。 这样提高了代码的可读性,也配合了STL中的算法。但是在容器中使用迭代器时候会发生迭代器失效问题,所以我们就得注意。 首先我们看vector的迭代器失效问题 在vector中迭代器失效发生在insert和erase中。 我们先看insert,在vector中插入元素,插入元素后当发现开辟的空间不够了...

GangStudyIT的博客 4429

STL迭代器失效的场景总结

STL迭代器失效的场景总结

qq_43148810的博客 1871

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 406

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3677

【C++】STL容器中的迭代器失效问题

什么是迭代器失效?在 C++ 中,。但在对容器执行某些操作(如插入、删除、扩容等)后,,也就是说,它指向的内容不再可靠,继续使用会导致程序崩溃或产生未定义行为,这种现象被称为。为什么会失效?对于像vector这类连续存储容器,一旦发生扩容,其内部元素的位置就会整体迁移,原先的迭代器(指针)指向的是旧地址,自然就失效了。删除元素后,容器可能会移动其他元素填补空位,导致原迭代器指向的元素不存在或顺序变化。插入元素也可能使部分迭代器变得不可靠,尤其是插入点之后的迭代器。

qq_48178317的博客 848

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5729

C++ STL 迭代器失效问题

之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]={0,1,2,3,4,5,6,7,8,9,10};   vectorint> a(arr,arr+s

coderCong的博客 7239

领域驱动设计整理——实体和值对象设计

实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的关注点从数据的属性和表的关联转化到了富有行为的领域概念上。 实体是具有可变性的,这是一个和值对象比较明显的区分,也即实体是可以持续得变化,持续得修改,并且具有唯一的标识。在设计实体的时候需要跳出CRUD的

马猴烧酒└(┐卍^o^)卍ドゥルルル~楪詩月「YUZURIHA SHIZUKI」 2万+

基于MATLAB的数字滤波器之低通滤波器

本文首先介绍了数字低通滤波器的概念和原理,其次论述了低通滤波器的技术指标和设计步骤,最后给出了数字低通滤波器应用于信号去噪的MATLAB代码。

总结论文中的算法并给出论文的复现代码 3万+

【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题

在C++的STL(Standard Template Library)库中,vector容器无疑是最常用且功能强大的数据结构之一。它提供了动态数组的功能,允许我们在运行时动态地增加或减少元素。然而,随着我们对vector的深入使用,一些潜在的问题也逐渐浮现,其中最为常见和棘手的就是迭代器失效以及拷贝问题

EterNity_TiMe_的计算机学习之路 2381

【Windows Server 2019】活动目录 (Active Directory) ——将计算机加入域和脱离域

博文介绍了如何将计算机加入AD域和脱离AD域,包括加入域,验证客户机加入到域后的信息,使用域账户用户在客户机上登录,使用本地账户用户在计算机上登录,脱离域。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6169

【C++】STL--Vector迭代器失效问题

本文深入探讨了C++ vector中迭代器失效问题。主要包括:1)空间改变操作(如扩容)会导致迭代器指向旧空间而失效;2)元素删除操作可能导致迭代器失效,特别是尾删时;3)对比VS和g++编译器对失效迭代器的处理差异,VS更严格而g++可能有隐患。文章通过代码示例说明失效场景,并强调无论何种编译器都应重新赋值失效迭代器以确保程序正确性。

小陈为梦想而生 897

添加USB wifi驱动到RK3568

在日常开发中我们经常需要用到wifi功能,一般来说soc厂家都会事先做好了几个厂家的wifi驱动在内核源码目录下,我们只需要按原理图配置对应的设备树即可。常用的wifi的接口有:USBSDIOPCIE下面来介绍这这种接口是如何使用wifi芯片。提示:以下是本篇文章正文内容,下面案例可供参考本小节介绍了一个配置一个USBwifi驱动的整个流程,并没有介绍到SDIO,下小节基于AP6256介绍如何使用。

qq_24093081的博客 2049

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++——STL的迭代器失效问题

本文转载自:https://blog.youkuaiyun.com/coderCong/article/details/52065130 之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 ...

Lycorisradiata__的博客 339

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题

探索STL奥秘(五)之——vector的迭代器失效问题(新手极容易出错,一定要好好看看!!!)

2301_80220607的博客 3445

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

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【C++STL】迭代器分类 失效问题

正向迭代器iterator容器.begin()容器.end()正向遍历容器内元素常正向迭代器容器.cbegin()容器.cend()正向遍历容器内的常量元素反向迭代器容器.rbegin()容器.rend()反向遍历容器内元素常反向迭代器容器.crbegin()容器.crend()反向遍历容器内的常量元素int main()//正向迭代器while (it!it++;//常正向迭代器while (cit!cit++;//反向迭代器。

努力让自己的能力配得上梦想. 830

C++ stl中的vector的相关用法 迭代器失效问题

1、vector是用于表示可变大小数组的序列容器。2、vector就像数组一样,采用的是连续的空间来存储元素,也意味着可以通过下标对vector的元素进行访问和修改。3、普通数组的大小不可以动态改变,vector的大小可以动态改变。4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。

fallzzzzz的博客 832

c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

在前面的章节我们已经接触过了关于STL的知识,也就是string类,我们详细介绍了string类的特性及使用,而严格来说string类并没有被归为STL中,因为string类的出现早于STL,string类的接口也比STL中的单个类多,使得string类较其他类显得冗余,这一期我们就要开始讲STL中的内容。1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。

qq_58761784的博客 2073

【C++】STL的迭代器失效问题

迭代器失效

xiaomage1213888的博客 1755

C++ stl迭代器 (迭代器失效问题)

C++剖析stl 迭代器是什么?:迭代器 和 指针;迭代器失效;详解`vector`迭代器失效

知识分享与学习笔记总结,欢迎指点 4667

[C++] STL_vector 迭代器失效问题

STL_vector迭代器失效问题分析+解决方案

Ljy_cx_21_4_3的博客 3104

C++ stl迭代器 (迭代器失效问题)_c++ 迭代器失效

🥦 迭代器是指向元素范围(如数组或容器)中的某个元素的任何对象,它能够使用一组运算符(至少具有自增(++) 和解引用 (*) 运算符)循环访问该范围的元素。🍊 迭代器最明显的形式是指针:指针可以指向数组中的元素,并且可以使用增量运算符 (++) 循环访问这些元素。但其他类型的迭代器也是可能的。例如,每个容器类型(如list )都有一个特定的迭代器类型,旨在循环访问其元素。

2401_87255253的博客 1338

C++ STL中迭代器失效问题

C++ STL中迭代器失效问题其实,在我们学习过程中,C++ STL使我们必须要用的一个库,里面集成了很多的数据结构和算法,这些在我们写程序的时候,用的特别多。但是,使用这些,我们经常会出现一些问题,毕竟C++中内存的申请和释放都是程序员亲自去做的,所以说,在使用STL的时候,我们也会遇到很多问题,其中一个就是我们所谓的迭代器。迭代器,其实我们用通俗的理解就是类似于我们使用指针去遍历数组,然后访问元

Travelerwz的博客 782
上一篇: 未确定数组个数、大小的ACM模式输入输出(C++)
下一篇: variable ‘XXX cannot be implicitly captured in a lambda with no capture-default specified
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值