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

C++:iterator迭代器失效

说明:这里拿 vector 举例。

原因一:扩容导致迭代器失效

// 迭代器失效
void insert(iterator pos, const T& x)
{
	assert(pos >= _start);
	assert(pos <= _finish);

	// 满了就扩容
	if (_finish == _end_of_storage)
	{
		reserve(capacity() == 0 ? 4 : capacity() * 2);
	}

	iterator it = _finish - 1;
	while (it >= pos)
	{
		*(it + 1) = *it;
		--it;
	}

	*pos = x;
	++_finish;
}

正确写法:

void insert(iterator pos, const T& x)
{
		assert(pos >= _start);
		assert(pos <= _finish);

		// 满了就扩容,导致pos失效,失效后不能使用,更新后才能使用
		if (_finish == _end_of_storage)
		{
			size_t len = pos - _start;
			reserve(capacity() == 0 ? 4 : capacity() * 2);
			pos = _start + len;    // 更新pos
		}

		iterator it = _finish - 1;
		while (it >= pos)
		{
			*(it + 1) = *it;
			--it;
		}

		*pos = x;
		++_finish;
}

原因二:insert后迭代器失效(野指针)

正确做法,最好是在insert之后不要使用它的迭代器!!!

原因三:erase后迭代器失效(强制检查)

// 迭代器失效 
void erase(iterator pos)
{
	assert(pos >= _start);
	assert(pos < _finish);

	iterator it = pos + 1;
	while (it < _finish)
	{
		*(it - 1) = *it;
		++it;
	}

	--_finish;
}

正确写法(系统的做法):系统erase(it)后,会返回删除值的下一个位置;但我们要记住,虽然可以这样解决,但是erase(it)之后,不要再去访问it迭代器,它已经失效了

iterator erase(iterator pos)
{
	assert(pos >= _start);
	assert(pos < _finish);

	iterator it = pos + 1;
	while (it < _finish)
	{
		*(it - 1) = *it;
		++it;
	}

	--_finish;

	return pos;    // 下一个位置还是pos
}

http://www.dtcms.com/a/26354.html

相关文章:

  • c++播放音频
  • top命令输出内容详解
  • 【设计模式】【创建型模式】建造者模式(Builder)
  • FreeRTOS-rust 编译分析
  • 【C++】实现一个JSON解析器
  • ubuntu上如何查看coredump文件默认保存在哪个路径?
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑲】
  • Xilinx FPGA工程移植步骤---包含软核工程
  • LeetCode刷题---哈希表---215
  • Jedis 客户端 用于java连接redis服务
  • Vue3 打造 Windows 桌面个性高效组件工具
  • git clone
  • Java运算符
  • 【原创】Ubuntu 22安装nexus私服
  • LeetCode刷题---哈希表---451
  • Kubernetes Pod健康检查全解析:从Liveness到滚动更新,掌握容器健康管理的核心技巧
  • DeepSeek是什么?两种模型的对比?
  • 系统设计之分布式
  • C++编程语言:抽象机制:模板和层级结构(Bjarne Stroustrup)
  • 宏块划分的原理
  • LeetCode1299
  • 自动创建spring boot应用(eclipse版本)
  • DeepSeek 入门指南
  • 【解决方法】vite-plugin-svg-icons使用中出现问题[vite] Cannot find package ‘fast-glob‘
  • 网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
  • BiRefNet C++ TensorRT (二分类图像分割)
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 1
  • [原创](Modern C++)现代C++的关键性概念: 妙用std::reference_wrapper, 让std::list容器具有随机访问功能.
  • Zookeeper(54)如何使用Zookeeper的命令行工具?
  • 寒假学习总结