STL容器中迭代器失效的场景:

以vector为例进行分析

vector进行数据插入

  1. 如果空间充足那组,插入数据后,原有数据向后移动,导致迭代器失效
  2. 如果空间不足,插入新数据需要扩容,则发生拷贝,导致迭代器失效
void reverse(size_t n){if (n > capacity()){//保存有效元素个数size_t sz = size();//申请空间T* tmp = new T[n];//拷贝原有空间if (_start){//memcpy(tmp, _start, sizeof(T)*size());//内置类型 进行深拷贝  如果自定义类型 进行浅拷贝for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];//调用赋值运算符重载函数进行深拷贝,目的是 保证类型完成深拷贝(比如自定义string类型)}delete[]_start;}//更新_start = tmp;//_finish=_start+size();//由于start更新 导致size()出问题  finish丢失,需要提前记录size ,重新找到finish指向_finish = _start + sz;_endofstorage = _start + n;}}void insert(iterator pos, const T& val){//检查位置assert( pos<=end()&&pos>=begin());//检查容量if (_finish == _endofstorage){//记录偏移量size_t offset = pos - _start;size_t newcap = _endofstorage == nullptr ? 1 : 2 * capacity();reverse(newcap);//增容空间拷贝导致迭代器失效 pos位置丢失pos = _start + offset;//增容之后 更新pos位置}//移动元素iterator it = end();while (it>pos){*it = *(it - 1);it--;}*pos = val;//更新_finish++;}

解决插入后迭代器失效的方法就是如果需要扩容就在插入前记录当前插入位置距起始位置的偏移量,扩容之后,根据偏移量更新插入位置,同时移动元素从后往前遍历,移动更新迭代器指向位置

vector进行数据删除

给一个int类型的vector容器增加20个整数,然后删除里面所有的偶数

vector<int> vec;
for(int i=0; i<20; ++i)
{vec.push_back(rand()%100);
}
vector<int>::iterator it = vec.begin();
while(it!=vec.end())
{if(*it % 2 == 0){vec.erase(it);}else{++it;}}

上述代码中,删除第一个偶数后,起始位置到当前删除位置的迭代器都是正常的,之后的失效

解决方法如下:

vector<int> vec;
for (int i = 0; i < 20; ++i)
{vec.push_back(rand() % 100);
}vector<int>::iterator it = vec.begin();
while (it != vec.end())
{if (*it % 2 == 0){it = vec.erase(it);}else{++it;}
}
return 0;

由于erase返回删除位置的下一位置,每次删除重新对迭代器赋值,更新迭代器位置指向,此时已经指向下一位置,所以不需要迭代器后移,否则会跳过部分数据,这个点经常出现在一些选择题代码分析上哦

面试中常被问到(九)STL迭代器失效问题相关推荐

  1. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  2. 面试中常被问到(11)虚函数/纯虚函数

    虚函数 如何定义一个虚函数?在基类成员函数前加入virtual关键字,但并不代表此函数不被实现,只是说明允许基类指针调用派生类重写的此函数 一个类只要声明有虚函数或者从基类继承了虚函数,在编译过程中就 ...

  3. e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗

    #新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...

  4. 面试中常被问到(五)C++析构函数,虚析构函数

    C++析构函数 (1)对于析构函数:析构函数与构造函数相呼应,从调用构造函数开始到自动执行析构函数二者调用期间即为所创建对象实例的生命周期. (2)析构函数与类名相同,仅前面加一个~,一般析构函数无参 ...

  5. 面试中常被问到(八)STL标准库容器分类

    目录 顺序容器 关联容器: 容器适配器: 顺序容器 vector: 向量容器,类似于数组功能,但比数组更灵活,底层是动态开辟的一维数组,内存可自增,每次默认增值2倍 vector内存绝对连续,适合随机 ...

  6. Linux运维面试中常被问到的两个shell脚本

    脚本一: 在公司里有一个网段是 192.168.3.0的网段,现在想判断一下哪些主机在线,哪些主机不在线. shell脚本解决方案: 方法一: 思路 首先要循环目标主机的IP地址,IP地址分为两部分: ...

  7. 面试:整理面试中常被问到的8种数据结构

    数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作.数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系统都使用数据结构.此外,数据 ...

  8. 面试中常被问到的(21)TCP/UDP如何保持可靠性

    Tcp保持可靠性从以下三个方面描述: 1,可靠传输:面向连接,包序管理,确认应答,超时重传,校验和 2,避免丢包:滑动窗口流量控制,拥塞机制(慢启动快增长) 3,提高性能:确认序号快速重传,延迟应答, ...

  9. 面试中常被问到(三)c/c++区别

    c/c++区别 c是面向过程的语言,c++是面向对象的语言,现如今都采用面向对象(oop)编程技术,为什么oop语言如此热门呢? 比如像c++语言中,有封装(类及对象),继承和多态机制,此外c++还支 ...

最新文章

  1. 进来进程有人问表空间的迁移问题
  2. [原]Console小技巧——Console版贪食蛇
  3. 网站搭建从零开始(一)域名
  4. 杨中科的.NET 6新书的出版进度汇报
  5. 霸主–统治和管理API的地方
  6. SqlServer自定义聚合函数
  7. 【数据结构基础】-串-顺序结构的基本操作实现
  8. vlan间路由的问题
  9. Python基础班---第一部分(基础)---Python基础知识---计算机组成原理
  10. 将list的内容转换成固定个数的分组字符串
  11. B - C语言实验——整数位
  12. tomcat源码分析--初始化与启动
  13. html5 手机上传视频,【报Bug】手机h5端收不到选择视频以及上传视频回调
  14. 系统调用服务号 linux 2.6.32
  15. 比Navicat好用百倍的通用数据库管理工具,功能强大,最主要还免费!
  16. vue 符号..._如何在Windows 8.1上输入和使用表情符号
  17. buctoj周赛(5)逃离(三分+思维)
  18. pic16f1829 c语言,PIC16F1829 串口初始化程序及应用
  19. oracle存小数用 number(m,n)
  20. vue渲染.md文件

热门文章

  1. mac gitk启动报错
  2. android 动态生成多个textview,android – 如何将多个TextView动态添加到main.xml中的定义LinearLayout...
  3. OpenCV 边缘检测
  4. java开发定位思维和思路
  5. 小猪猪分享:如何将pdf转换成jpg图片
  6. 调节pycharm字体大_钢管钢板大字符喷码机手持式@钢管钢板大字符喷码机手持式最大字符...
  7. python怎么重复输入密码直至正确_python作业/练习/实战:生成随机密码
  8. 微型计算机原理与接口技术 (周荷琴 冯焕清) 第六版 课后习题答案 第八章(部分答案)
  9. 编程语言小传之 零.第一个研究写程序的女人
  10. 电脑xp系统坏了,如何重装系统