STL迭代器失效的场景总结

2023-10-31

一、序列式容器迭代器失效的场景

序列式容器以vector为例。分别有以下情况会失效:

1、push_back() 使迭代器失效。

​ 在容器末尾添加一个元素。如果容器有剩余空间(capacity() > size()),则直接添加新元素到容器尾部。此时,原迭代器中end()会失效,其他的都不会失效。如果容器没有剩余空间(capacity() == size()),会导致容器重新分配内存,然后将数据从原内存复制到新内存,再在尾部添加新元素。此时,由于内存重新分配,原迭代器(所有)都失效

2、pop_back() 使迭代器失效。

​ 直接将容器中的最后一个元素删除,原迭代器中最后一个元素的迭代器和end()会失效,其余的都不会失效

3、insert(iterator, n) 使迭代器失效。

​ 如果容器有剩余空间,先在容器尾部插入一个元素,然后将插入点及之后的元素都向后移动一位,然后在插入点创建新元素。否则,会导致容器重新分配内存,接着将插入点之前的元素复制过去,在插入点创建新元素,再将插入点之后的元素复制过去。因此 ,如果没有内存的重新分配,原迭代器中插入点及插入点之后的迭代器(包括end())都失效。如果有内存的重新分配,原迭代器(所有)都失效

4、erase(iterator) 使迭代器失效。

​ 将删除点及之后的元素都向前移动一位,然后删除最后一个元素。因此,原迭代器中删除点之前的迭代器都有效,删除点之后的元素迭代器都失效

二、关联式容器迭代器失效场景

set、multiset、map、multimap, 使用红黑树来存储数据。

1、insert(iterator) 插入不会使得任何迭代器失效

2、删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器。erase迭代器只是被删元素的迭代器失效,返回值为被删除元素的下一个迭代器,所以要采用 iter=contan.erase(iter)和erase(iter++)的方式删除迭代器。erase(iter++)的删除方法对于内存连续的容器,例如vector不可用,因为被删除元素的下一个迭代器也失效了;iter=contan.erase(iter)则都可行。

三、防止因迭代器失效导致异常

1、删除多个元素方法:

for(vector<T>::iterator iter=veci.begin(); iter!=veci.end(); )
{
	if(判断删除的元素的条件)
	{
		{//元素类型T为原始指针时
			//T tmp = *iter;
			//delete tmp;
		}
		iter = veci.erase(iter);
	}
    else
	{
		iter ++ ;
	}
}

2、clear清除数据出现假删除
容器中的数据没了,容器中的内存还在,也就是clear可以清除数据使容器size变成0,但不会是容器容量capacity变成0。
clear只会清楚容器中的元素。若元素为指针,指针托管的堆内对象的内存需要手动清理。

//元素类型T为原始指针时
for(vector<T>::iterator iter=veci.begin(); iter!=veci.end(); )
{
	T tmp = *iter;
	delete tmp;
	iter = veci.erase(iter);
}

//元素类型T为对象或一版类型时,智能指针类型为对象,而非真正的指针
for(vector<T>::iterator iter=veci.begin(); iter!=veci.end(); )
{
	iter = veci.erase(iter);
}
//与clear等效
veci.clear();

有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL迭代器失效的场景总结 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • Windows上运行Linux

    在Windows上运行linux有多种方案 我一个个说吧 WSL 这是微软官方支持的方案 因为WSL就是操作系统自带的内容 我的机器是Windows11系统 所以我可以直接在power shell里使用 第一步是用WSL安装linux虚拟机
  • k8s篇之Pod 干预与 PDB

    文章目录 自愿干预和非自愿干预 PDB PDB 示例 分离集群所有者和应用程序所有者角色 如何在集群上执行中断操作 自愿干预和非自愿干预 Pod 不会消失 除非有人 用户或控制器 将其销毁 或者出现了不可避免的硬件或软件系统错误 我们把这些
  • 路由器dhcp服务异常不能上网_网络连接配置错误和DHCP服务存在问题导致无法..._网络编辑_帮考网...

    枫月舞 2019 07 15 13 28 908 请安以下方法查找原因 一 网络设置的问题 这种原因比较多出现在需要手动指定IP 网关 DNS服务器联网方式下 及使用代理服务器上网的 仔细检查计算机的网络设置 二 DNS服务器的问题 当IE
  • SpringBoot+Druid+MyBatis实现多数据源

    我们使用动态的方式进行多数据源的配置 更加灵活方便 1 配置文件 spring datasource druid one type com alibaba druid pool DruidDataSource driver class na
  • OpenAI开发系列(八):基于思维链(CoT)的进阶提示工程

    授权声明 本文基于九天Hector的原创课程资料创作 已获得其正式授权 原课程出处 九天Hector的B站主页 感谢九天Hector为学习者带来的宝贵知识 请尊重原创 转载或引用时 请标明来源 全文共9000余字 预计阅读时间约18 30分
  • jdbc批量操作的三种方法

    Jdbc批量操作 方法一 Connection conn DriverManager getConnection url name password conn setAutoCommit false 关闭连接的自动提交 String sql
  • windows 下重置mysql root 密码

    其中第3步和第8步 对于不同版本的mysql 版本有变化 1 关闭正在运行的MySQL服务 可以打开任务管理器 gt 服务 找到mysql 停止 2 通过cmd 转到mysql bin目录 例如 cd C Msql mysqlxxxxx b
  • warning:dereferencing type-punned pointer will break strict-aliasing rules

    中文警告 提领类型双关的指针将破坏强重叠规则 warning dereferencing type punned pointer will break strict aliasing rules 在 gcc 2 x 下编译没有任何 warn
  • 螺旋输出矩阵

    给定一个mmm行 nnn列的矩阵 按照顺时针螺旋的顺序输出矩阵中所有的元素 从 0 0 位置开始 具体请参见下图 输入格式 测评机会反复运行你写的程序 每次程序运行时 首先在第一行输入 222 个整数 分别对应题目描述中的 m 和 n 1
  • 华为防火墙 双机热备负载均衡实验

    双机热备 FW1的配置 FW2的配置 interface GigabitEthernet 1 0 1 ip address 10 1 1 2 255 255 255 0 vrrp vrid 1 virtual ip 10 1 1 1 255
  • VCED:学习Jina的简单操作

    文章目录 VCED 学习Jina的简单操作 在pycharm里连接docker环境 几个简单的jina demo image text video VCED 学习Jina的简单操作 在pycharm里连接docker环境 在pycharm里
  • keepalived实现lvs高可用

    keepalived是什么 Keepalived 软件起初是专为LVS负载均衡软件设计的 用来管理并监控LVS集群系统中各个服务节点的状态 后来又加入了可以实现高可用的VRRP功能 因此 Keepalived除了能够管理LVS软件外 还可以
  • 异常(exception)

    异常 什么是异常 程序在运行过程中发生的意外情况 称之为异常 除数为0 数组小标越界 异常是一种信号 用于调用者传递信息 表示程序发生了意外情况 程序运行时一旦出现了异常 将会导致程序立即终止 异常之后的代码都无法继续执行 那么为了保持程序
  • 酒令

    劝酒者起身敬酒 被劝者会说 屁股一抬 喝了重来 意让劝酒者再喝一个 此时劝酒者应对 屁股一动 表示尊重 男人不喝酒 交不到好朋友 感情深一口闷 感情浅舔一舔 女士劝酒 激动的心 颤抖的手 我给领导到杯酒 领导不喝嫌我丑 女士和领导碰杯 领导
  • 鼠标一离开导航菜单,二级菜单就隐藏,移不到二级菜单

    项目场景 提示 这里简述项目相关背景 例如 项目场景 示例 网站右侧导航 无法移入二级菜单 鼠标移出一级菜单 二级内容立刻消失 从而鼠标无法移入二级内容区域 类似CSDN官网右侧 鼠标hover到二维码图标后 显示左侧关注公众号和下载APP
  • C语言中几种输入方式

    当我们输入一串字符或者数字时 需要一种标志作为输入结束的标志 所以我总结了以下几种 1 输入一串字符串以回车键作为输入结束的标志 char ch while ch getchar n 例1 输入一行字符 分别统计出其中英文字母 空格 数字
  • 感应(异步)电机磁场定向控制速度环PI控制参数设计

    电机控制系列文章 感应 异步 电机磁场定向控制MATLAB Simulink建模 感应 异步 电机磁场定向控制电流环PI控制参数设计 目录 电机控制系列文章 前言 一 速度环开环传递函数 二 速度环开环传递函数零极点配置 三 速度环闭环性能
  • 【Twinkle】简历小问题

    在制作简历的时候 很多人都把心思放在如何撑满一张纸 当然 这确实很重要 但是在重内容的同时 我们容易忽略一些小问题 而这些小问题在HR的眼中其实是基本功的体现 更甚 这些小问题反倒是最扎眼的 比如字体 字号 行间距等 这些都是超脱于内容之外
  • [1199]npm常用命令

    文章目录 npm常用的安装命令 npm镜像源如何设置 npm将软件包安装到哪里 npx命令 npm文档 https docs npmjs com cli install npm常用的安装命令 npm i 就是npm install 简写 n
  • STL迭代器失效的场景总结

    一 序列式容器迭代器失效的场景 序列式容器以vector为例 分别有以下情况会失效 1 push back 使迭代器失效 在容器末尾添加一个元素 如果容器有剩余空间 capacity gt size 则直接添加新元素到容器尾部 此时 原迭代