当前位置: 首页 > 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
}

相关文章:

  • 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)
  • 宏块划分的原理
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点
  • 科普|“小”耳洞也会引发“大”疙瘩,如何治疗和预防?
  • 巫蛊:文化的历史暗流
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 全国重点网络媒体和网络达人走进沧州,探寻“文武双全”的多重魅力
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中