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

vactor中迭代器失效问题

目录

  • 什么是迭代器失效
  • 导致迭代器失效的操作
  • VS和g++环境下对与迭代器失效的态度

什么是迭代器失效

迭代器的底层其实就是一个指针,或者对指针进行了封装

vector的迭代器就是一个指针T*
一个迭代器指向某一个空间,此时这块空间被释放了,这个迭代器仍指向原来的那个空间,这个就叫迭代器的失效

如果继续使用已经失效的迭代器,程序可能会崩溃

在这里插入图片描述


导致迭代器失效的操作

引起底层空间发生变化的操作,都很有可能引起迭代器失效

迭代器失效,主要都是由inserterase导致的



下面我们看一个insert导致迭代器失效的情况

我们首先定义一个vector<int>对象和一个迭代器

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();
}

此时v的size()的值和capacity()的值都为6,如果再向v中插入数据,就需要扩容。

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容
}

v.insert(it, 0)会导致扩容,扩容其实就是另开辟一块更大空间,原空间销毁,所以此时迭代器it已经失效了,因为后面没有再使用it,所以暂时不会报错。
在这里插入图片描述

在这里插入图片描述


此处如果再使用已经失效的迭代器it,就会报错

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容v.insert(it, 0);
}

在这里插入图片描述
所以想要迭代器不失效,就要为迭代器重新赋值

insert函数在库中的定义为:

iterator insert (iterator position, const value_type& val)

可以看到它的返回值是iterator类型的,这其实返回了一个处理后不失效的迭代器,是指向第一个新插入元素的迭代器。

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();it = v.insert(it, 0);//此处会扩容v.insert(it, 10);//不会报错
}




下面看一下erase导致失效的情况:

其实大多数情况下,使用erase并不会导致迭代器

void test7()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin()+3;v.erase(it);
}

这里迭代器it指向的是4,v.erase(it)删除4后,后面的元素会向前补上来,没有导致底层空间的改变,理论上讲迭代器不应该会失效
在这里插入图片描述

如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了
在这里插入图片描述

以及,如果vector中如果只有一个元素,迭代器恰好指向这个元素,那么erase后,迭代就会失效

可以看出,erase虽然有的情况会导致迭代器失效,有点情况不会导致迭代器失效,但是在VS环境下就认为:删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。



其实与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效




VS和g++环境下对与迭代器失效的态度

  • VS环境下,对于迭代器失效十分严格,只要有迭代器失效的情况,编译器就会报错;只要删除vector中任意位置上元素时,就认为该位置迭代器失效了,报错
  • 但是linux上的g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。
    • 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了
    • erase删除任意位置代码后,linux下如果迭代器没有失效,程序还是会运行
    • erase删除的迭代器如果是最后一个元素,删除之后it已经超过end,如果++it还是会报错的
    • 所以迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的
http://www.lryc.cn/news/133099.html

相关文章:

  • 电子商务防火墙的作用
  • 「UG/NX」Block UI 选择特征SelectFeature
  • 【数据分享】2006-2021年我国城市级别的节约用水相关指标(免费获取\20多项指标)
  • Azure不可变Blob存储
  • No mapping found for HTTP request with URI
  • 视频转云存的痛点
  • 3D医学教学虚拟仿真系统:身临其境感受人体结构和功能
  • 【.net】本地调试运行只能用localhost的问题
  • 营销数字化|企业级 AIGC 工具的「iPhone 时刻」
  • Zookeeper集群单节点启动成功但未同步其他节点数据
  • 回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)
  • 第5步---MySQL的DQL查询语句
  • ChatGpt开源项目完美运行配置-ChatGml2
  • 微服务-GateWay(网关)
  • 基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构
  • 单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量
  • 如何在 3dmax 中渲染? 3dmax渲染教程
  • linux部署项目, 报数据库连接不上错误
  • 现有的vue3+ts+vite项目集成electron
  • 线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)
  • Ubuntu vi 左下角没有提示
  • Windows安装 Elasticsearch 教程
  • Dubbo 融合 Nacos 成为注册中心
  • kafka--kafka基础概念-ISR详解
  • 《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》
  • 音频解码及如何在Java实现
  • Webshell 及检测绕过
  • Ubuntu22.4系统mongodb数据库安装
  • Vue初识别--环境搭建--前置配置过程
  • 数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)