连续内存序列容器(vector, string, deque)

对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效,因为它们使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置,保证元素的连续性。当上述容器的erase方法可以返回下一个有效的iterator,即erase方法的返回的iterator指向紧接在被删除元素之后的元素的有效迭代器,因此,可以根据这个返回值继续访问后面的元素。

连续内存序列容器删除特定元素示例:

vector<int> vc;
for(vector<int>::iterator it != vc.begin(); it != vc.end(); )
{
if(need_delete())
it = vc.erase(it);
else
++it;
}

关联容器(set, multiset, map, multimap)

对于关联容器,删除当前iterator指向的元素,仅仅使得当前iterator失效,只要在erase时,递增当前iterator,获得下一个元素iterator即可。只是因为map之类的关联容器,使用红黑树实现,插入,删除一个结点不会对其他结点造成影响。关联容器的erase方法不能返回下一个有效迭代器(C++98),被删除的iterator失效,所有删除当前元素之前必须确保可以得到下一个iterator,可以使用”后置递增迭代器“技术。

关联容器删除特定元素示例:

map<int,int> m;
for(map<int,int>::iterator it = m.begin(); it!= m.end(); )
{
if(need_delete())
m.erase(it++);
else
++it;
}

因为传递给erase方法的it参数是iterator的一个副本,it++会指向下一个元素,所以erase得到了当前迭代器,在erase内部工作之前it已经++,指向下一个迭代器,正好满足需要。

非连续内存序列容器(list)

对于list来说,它使用了不连续的内存,并且它的erase方法也会返回下一个有效的iterator,因此上述两种删除特定元素的方法都可以使用。

STL容器迭代器失效分析的更多相关文章

  1. STL容器迭代器失效问题讨论

    STL源码剖析---迭代器失效小结 vector迭代器的几种失效的情况: .当插入(push_back)一个元素后,end操作返回的迭代器肯定失效. .当插入(push_back)一个元素后,capa ...

  2. C++ STL中迭代器失效的问题

    my_container.erase(iter); 其中my_container是STL的某种容器,iter是指向这个容器中某个元素的迭代器.如果不是在for,while循环中,这种方式删除元素没有问 ...

  3. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...

  4. STL源代码分析--迭代摘要、迭代器失效汇总

    Vector 1.内部数据结构:连续存储,比如数组. 2.随机訪问每一个元素,所须要的时间为常量. 3.在末尾添加或删除元素所需时间与元素数目无关,在中间或开头添加或删除元素所需时间随元素数目呈线性变 ...

  5. STL容器特征总结与迭代器失效

    Vector 内部数据结构:连续存储,例如数组. 随机访问每个元素,所需要的时间为常量. 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化. 可动态增 ...

  6. STL的erase()陷阱-迭代器失效总结

    下面材料整理自Internet&著作. STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.s ...

  7. stl vector、红黑树、set、multiset、map、multimap、迭代器失效、哈希表(hash_table)、hashset、hashmap、unordered_map、list

    stl:即标准模板库,该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法 六大组件: 容器.迭代器.算法.仿函数.空间配置器.迭代适配器 迭代器:迭代器(iterator)是一种抽象的设计 ...

  8. 【转载】STL 的 erase() 陷阱-迭代器失效总结

    下面材料整理自Internet&著作. TL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.se ...

  9. C++ STL 迭代器失效问题

    之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 莫名其妙的Erase 最初我 ...

随机推荐

  1. Win8 安装驱动

    从微软的网站上面下载了一些驱动,发现竟然没有Setup或者Install安装程序,囧. 快速查了一下,直接在inf文件右击的菜单里面选择“安装”即可.突然有点out的感觉. 参考:http://dig ...

  2. Qt属性表控件的使用 QtTreePropertyBrowser

    属性表是vs2003时引入的的新控件,用于流量和设置大量的信息,现在,很多软件上都能看到它的身影,如vs,Qt Creator等IDE的详细设置里都离不开属性表. 下图是Qt Creator里的属性表 ...

  3. CSU 1803 2016(数论)

    2016 Problem Description: 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1≤a≤n,1≤b≤m; a×b 是 2016 的倍数. Input: 输 ...

  4. firebug下载时出现there was an error loading firebug

    打开Firefox -> Preferences -> Advance ->Certificates 将Query OSCP....前面的checkbox取消

  5. IOS应用发布NSLog的如何注释

    #define IOS_DEBUG //发布时注释此行不输出log日志 #ifdef  IOS_DEBUG #define NSLog(...) NSLog(__VA_ARGS__) #else #d ...

  6. php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正“办事”的那个,提供一种办事接口的统称. ...

  7. 初始化ArrayList的两种方法

    方式一:  ArrayList<String> list = new ArrayList<String>();  String str01 = String("str ...

  8. 理解EnterCriticalSection 临界区

    通俗解释就像上厕所: 门锁了,就等着,等到别人出来了,进去锁上,然后该干什么干什么,干完了,把门打开 门没锁,就进去,锁上,然后该干什么干什么,干完了,把门打开 ------------------- ...

  9. [SQL]SQL类似统计功能的sql文

    declare @t table(name varchar(),type int) insert into @t union all union all union all union all if ...

  10. [ACDream 1430]SETI 后缀数组

    题目链接:http://acdream.info/problem?pid=1430 题目大意:给你一个长度不超过10000的字符串,问你出现过两次或两次以上的不重叠的子串有多少个. 后缀数组计算出he ...