迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。
     首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。
     我们看到实现上述所说的分配和撤销内存空间的方式以实现vector的自增长性,效率是极其低下的。为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacity和reserve成员可以看出这种机制。
    capacity和size的区别:size是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
    vector迭代器的几种失效的情况: 
1、当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
2、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
3、当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。
    deque迭代器的失效情况: 在C++Primer一书中是这样限定的: 
1、在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 
2、在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
3、在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。但是:我在vs2005测试发现第一条都不满足,不知为何?等以后深入STL以后慢慢的领会吧!
     只有list的迭代器好像很少情况下会失效。也许就只是在删除的时候,指向被删除节点的迭代器会失效吧,其他的还没有发现。
先看两条规制:
1、对于节点式容器(map, list, set)元素的删除,插入操作会导致指向该元素的迭代器失效,其他元素迭代器不受影响。
2、对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效。
众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:
代码如下:

iter = vec.insert(iter);
iter = vec.erase(iter);

STL源码剖析---迭代器失效小结相关推荐

  1. SGL STL源码剖析——迭代器

    SGL STL源码剖析--迭代器 迭代器 迭代器的型别 Traits的作用 迭代器相应的五种型别 __type_traits 迭代器 在我们使用STL容器的时候,迭代器是非常常见的,STL将容器和算法 ...

  2. STL源码剖析 迭代器iterator的概念 和 traits编程技法

    iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器(containers)和算法(a ...

  3. STL源码剖析 迭代器的概念和traits编程技法

    迭代器:依序巡防某个聚合物(容器)所含的各个元素,但是不需要暴露这个聚合物的内部表述方式 核心思想:将容器和算法分开,彼此独立设计 容器和算法的泛型化,均可以使用模板,使用迭代器连接容器和算法 例子 ...

  4. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...

  5. 【STL源码剖析】迭代器

    [STL源码剖析]迭代器 第3章 迭代器(iterators)与traits编程技法(<STL源码剖析> ) 3.1 迭代器设计思维--STL关键所在 3.2 迭代器(iterator)是 ...

  6. 《STL源码剖析》相关面试题总结

    一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...

  7. STL源码剖析面试问题

    当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...

  8. C++ STL源码剖析 笔记

    写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...

  9. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

最新文章

  1. 2017 清北济南考前刷题Day 2 afternoon
  2. 从零开始搭建Android框架系列
  3. mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(
  4. python适合机器视觉_Python机器视觉编程常用数据结构与示例
  5. 计网学习第一章:概述
  6. 前端web 技术盘点
  7. 微信开发(一)SAE环境搭建
  8. Ubuntu下解决文件名mp3标签和文本文件内容的乱码问题
  9. 转:extjs里的fieldset不居中的解决办法(记录)
  10. 通过谷歌浏览器,找到页面某个事件属于哪个js文件
  11. Revit中视图隐藏部分轴号字符及控制视图类别【隐藏/显示】
  12. 手机号归属地查询实例
  13. 三菱FX3U 485ADP与东元TECO变频器N310通讯实战程序
  14. php电子面单打印快递100,使用快递100软件打印电子面单设置操作教程
  15. 210917-电脑护眼模式总结
  16. 【react】---redux-actions的基本使用---【巷子】
  17. Codeforces 1292C Xenon's Attack on the Gangs
  18. QT中的QLineEdit设置setEchoMode
  19. python将多个列表合并_Python将多个list合并为1个list的方法
  20. 银行卡识别-自动识别银行卡号

热门文章

  1. 海啸(二维前缀和/二维树状数组)
  2. P3952 时间复杂度(模拟)
  3. oracle access manager token,AuthenticationManager验证原理
  4. python类型转换异常捕捉_Java中的异常
  5. Serverless 工程实践 | 细数 Serverless 的配套服务
  6. 速约~阿里云存储新品发布会
  7. ajax将数据显示在class为content的标签中_python selenium:自动化爬取某鱼数据
  8. 近乎于“妖”!浅谈《山海镜花》的美术风格与设计
  9. JavaWeb课程复习资料——中文乱码上下文处理
  10. openflow多级流表机制的优点?