编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

解决C++ STL vector的迭代器失效的方法

gowuye 2024-04-29 16:09 12 浏览 0 评论

上一篇已经给大家分享了《C++ STL vector内存分配策略》,想了解的可以去查看。既然vector是动态分配内存,就会存在迭代器失效的可能,这是很多c++程序员容易出现BUG的地方。

导致迭代器失效的操作主要是insert、push_back(emplace_back)等操作,因为这些操作有可能导致vector重新分配内存,新分配内存后,会释放原来的内存,这时原来的迭代器会失效,如果继续访问会导致程序崩溃。比如:


那么如何解决这个问题呢?两种方法:

1.更新迭代器的值,运行正常:

2.重新定义迭代器,运行正常:

总结:

因此我们在做了一些可能影响迭代器的操作后,如果还想用原来的迭代器的话,一定要记得更新,否则会导致程序崩溃。


文本代码如下,需要测试的自取:

1.迭代器失效导致程序崩溃代码:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

//这里想打印刚刚插入的元素,但由于迭代器失效,程序会直接崩溃

for (; it != intVec.end(); ++it)

{

cout << *it << endl;

}

return 0;

}

2.迭代器失效,更新迭代器,运行正常:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

it = intVec.begin();//更新一下迭代器的值就正常了

for (; it != intVec.end(); ++it)

{

cout << *it << endl;

}

return 0;

}

3.迭代器失效,重新定义迭代器,运行正常:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

std::vector<int> intVec;

auto it = intVec.begin();//这里定义了迭代器

intVec.push_back(1);

intVec.push_back(2);

auto it1 = intVec.begin();//重新定义迭代器,运行正常

for (; it1 != intVec.end(); ++it1)

{

cout << *it1 << endl;

}

return 0;

}

相关推荐

C# List 常用方法
C# List 常用方法

此例子会尽量将C#list中的常用方法给大家写一遍。准备一个设备类publicclassCEquipment{public...

2024-05-16 15:05 gowuye

高效检测Internet连接:C#中的简单方法与推荐实践

在C#中,检测Internet连接是否可用是一个常见的需求,特别是在开发网络应用时。这可以确保应用程序在尝试执行网络操作之前,用户已经连接到了Internet。本文将介绍几种在C#中检测Interne...

304.C# 设计模式:模板方法(Template Method)
304.C# 设计模式:模板方法(Template Method)

摘要模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤的具体实现延迟到子类中。模板方法模式通过抽象类和具体类的组合来实现,抽象类定义了算法的骨...

2024-05-16 15:05 gowuye

C#常见技能_参数传递
C#常见技能_参数传递

大家好,我是华山自控编程朱老师前几天一个学员在学习C#与参数传递交互时,也不知道参数传递可以用来做什么。下面我们就详细讲讲C#和参数传递交互的相关知识。C#...

2024-05-16 15:04 gowuye

C#图解教程(第5版)
C#图解教程(第5版)

C#图解教程(第5版)作者:[美]丹尼尔·索利斯/[美]卡尔·施罗坦博尔出版社:人民邮电出版社译者:窦衍森/姚琪琳等出版年:2019-11...

2024-05-16 15:04 gowuye

C#-方法(2) 057
C#-方法(2) 057

方法分为静态方法与实例方法,现在学习的主要是静态方法;实例方法等学习类的时候再说,到时讲解它们有何区别使用方法的好处就是当程序中出现一些重复的代码时,可以把它写...

2024-05-16 15:04 gowuye

一个监控C#方法运行耗时开源库
一个监控C#方法运行耗时开源库

在项目开发中,我们经常需要监控某些方法的运行耗时,找出性能问题的所在地方。今天给大家,推荐一个用来统计C#方法运行耗时的开源库。01项目简介一个轻量级.Net库...

2024-05-16 15:04 gowuye

C#模拟键盘按键的三种方式实现
C#模拟键盘按键的三种方式实现

1.System.Windows.Forms.SendKeys使用SendKeys将键击和组合键击发送到活动应用程序。此类无法实例化。若要发送一个键击给某个...

2024-05-16 15:03 gowuye

网上看到的比较全面的c#帮助类,各种功能性代码,拿来即可用
网上看到的比较全面的c#帮助类,各种功能性代码,拿来即可用

今天给大家分享一个GitHub上比较全面的C#帮助类,项目GitHub地址:https://github.com/sgmcumt/Common.Utility...

2024-05-16 15:03 gowuye

C#中同步方法如何优雅调用异步方法

在C#中,同步方法优雅地调用异步方法通常涉及到异步编程的一些基本概念,如async和await关键字,以及任务(Task)类型。下面是一些常用的方法来同步地调用异步方法:使用async和await关键...

【2.C#基础】8.方法

8.方法8.1概述在编写程序时,一般会按照逻辑对处理进行分解,被分解的代码片段称为“方法”。C#中的函数(也可以称为方法)是一段具有签名(由函数名、参数类型和参数修饰符组成的函数信息)的代码块,...

C# 操作JSON的几种方式
C# 操作JSON的几种方式

关于Json数据在开发中的重要性,自然不言而喻;本篇通过两种在c#中常用的方式来实现对Json数据的序列化和反序列化,为了实现大多数的需求,我们采用稍微复杂一点...

2024-05-16 15:03 gowuye

C#自学——方法、可空类型
C#自学——方法、可空类型

方法方法的结构<访问修饰符><返回类型><方法名>(参数1,参数2,...){方法体}访问修饰符派生类...

2024-05-16 15:03 gowuye

精通c# -- 匿名方法与Lambda表达式

当用常规的委托调用方法时使代码很混乱或者不简洁的时候,可以使用匿名方法(内联代码块定义)。什么意思呢,我们用委托调用方法时,是根据方法名调用的,当需要待用的方法很多时,我们创建很多的方法,但是很多方法...

函数(7-7)匿名方法-C#编程零基础到入门学习
函数(7-7)匿名方法-C#编程零基础到入门学习

匿名方法顾名思义,匿名方法是没有名称的方法。可以使用委托(delegate)关键字定义C#中的匿名方法,可以使用lambda表达式来定义,并且可以将其分配给委托...

2024-05-16 15:02 gowuye

取消回复欢迎 发表评论: