当前位置: 首页 > article >正文

C++ vector迭代器失效

STL中vector迭代器失效常见错误写法示例

最近在看STL容器失效的例子,涉及到vector数组迭代器失效的问题,如果不注意使用,很容易出现问题,我们先来看一下一个简单的示例程序,在数组nums中删除大于50的元素,代码如下:

#include <vector>
#include <iostream>

int main()
{
	std::vector<int> nums = { 15, 25, 8, 45, 78, 90, 125 };
	for (auto iter = nums.begin(); iter != nums.end();) {
		if (*iter > 50) {
			nums.erase(iter);	// 此处在删除iter之后iter迭代器失效,再在后续的for循环中使用iter时会导致崩溃
		} else {
			iter++;
		}
	}

	for (auto num : nums) {
		std::cout << num << std::endl;
	}

	std::cin.get();

	return 0;
}

在Visual Studio中运行上述程序后,会导致程序崩溃,截图如下:
运行崩溃
错误为:vector iterators incompatible,即向量迭代器不兼容
下面我们来看一下崩溃时的堆栈:
崩溃堆栈
程序崩溃了
vector迭代器操作报错

正确的用法

首先我们来看一下正确的写法,代码如下:

#include <vector>
#include <iostream>

int main()
{
	std::vector<int> nums = { 15, 25, 8, 45, 78, 90, 125 };
	for (auto iter = nums.begin(); iter != nums.end();) {
		if (*iter > 50) {
			//nums.erase(iter);	// 此处在删除iter之后iter迭代器失效,再在后续的for循环中使用iter时会导致崩溃
			iter = nums.erase(iter);
		} else {
			iter++;
		}
	}

	for (auto num : nums) {
		std::cout << num << std::endl;
	}

	std::cin.get();

	return 0;
}

程序运行结果如下:
正确的写法运行结果
可以看到将之前代码的第9行的nums.erase(iter); 语句改成iter = nums.erase(iter);就能正常删除vector数组中大于50的数了。这是因为vector数组在对某个iter迭代器执行erase操作之后会返回一个后向迭代器。而且vector是顺序容器,直接对nums.erase(iter)操作之后,iter本身以及其后的元素都会挪动位置了。但是nums.erase(iter)会返回一个正确的后序迭代器,将其赋值给iter,再对iter进行操作就OK了。


http://www.kler.cn/a/145236.html

相关文章:

  • 大数据相关职位 职业进阶路径
  • 《大语言模型》综述学习笔记
  • 【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
  • Python中的函数(下)
  • 软件工程概论试题三
  • 1.五子棋对弈python解法——2024年省赛蓝桥杯真题
  • libbz2 for Mac OS makefile
  • C语言--利用选择法对数组中的10个整数按由小到大排序
  • 13年老鸟总结,性能测试方法汇总+性能响应很慢排查方法(详全)
  • Linux内核--内存管理(十三)vmalloc的实现
  • 流程图是什么,用什么软件做?
  • WIFI模块(esp-01s)获取网络时间与天气信息
  • VCenter连接主机提示:未验证主机SSL证书的真实性
  • ArcGIS中基于人口数据计算人口密度的方法
  • MYSQL基础知识之【修改数据,删除数据】
  • 可燃气体监测仪助力燃气管网安全监测,效果一览
  • 【深度优先搜索】
  • Centos上安装Docker和DockerCompose
  • 利用ngrok实现内网穿透(全网最详细教程)
  • 什么是 TLS/SSL 握手
  • 区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第四套区块链应用后端开发
  • flex布局实战之自动填充剩余
  • 4D Gaussian Splatting:用于实时的动态场景渲染
  • 网络篇---第一篇
  • 【华为OD】B\C卷真题:100%通过:找城市 C/C++实现
  • 云下的我们