`

正确使用stl map的erase方法

    博客分类:
  • c++
 
阅读更多

STL的map表里有一个erase方法用来从一个map中删除掉指令的节点
eg:

map<string,string> mapTest;
typedef map
<string,string>::iterator ITER;

ITER iter
=mapTest.find(key);
mapTest.erase(iter);

 像上面这样只是删除单个节点,map的形为不会出现任务问题,
但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.
像下面这样的一个例子就是错误的写法,
eg:

for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{
cout
<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}

这是一种错误的写法,会导致程序行为不可知.究其原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。
可以用以下方法解决这问题:
正确的写法
1.使用删除之前的迭代器定位下一个元素。STL建议的使用方式

for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout
<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter
++);
}

2. erase() 成员函数返回下一个元素的迭代器

for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout
<<iter->first<<":"<<iter->second<<endl;
iter
=mapTest.erase(iter);
}
分享到:
评论

相关推荐

    stl容器set,map,vector之erase用法与返回值详细解析

    在使用 list、set 或 map遍历删除某些元素时可以这样使用,如下所示

    effective stl stl 技巧

    使用STL编程 条款43:尽量用算法调用代替手写循环 条款44:尽量用成员函数代替同名的算法 条款45:注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别 条款46:考虑使用函数对象代替...

    关于STL的erase()陷阱-迭代器失效问题的总结

    在使用erase方法来删除元素时,需要注意一些问题。 1.list,set,map容器 在使用 list、set 或 map遍历删除某些元素时可以这样使用: 1.1 正确写法1 std::list&lt; int&gt; List; std::list&lt; int&gt;::iterator itList; for( ...

    Effective STL(中文)

    &lt;br&gt;《Effective STL》目录: &lt;br&gt;前言 致谢 导读 容器 条款1:仔细选择你的容器 条款2:小心对“容器无关代码”的幻想 条款3:使容器里对象的拷贝操作轻量而正确 条款4:用empty来代替...

    Effictive STL CHM中文版

    条款24: 当效率很关键时尽量用map::insert代替map::operator 条款25: 让自己熟悉非标准的hash容器 迭代器 条款26: 尽量使用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 条款27: 使用...

    C++STL讲解 PPT版本

    STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。 STL包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。从...

    effective stl 中文 pdf

    怎么使用stl 这里几乎都有说明 条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: 尽量使用范围成员函数...

    STL源码剖析.pdg

    sgi stl 内部文件(sgi stl真正实现于此) 018 1.8.3 sgi stl 的组态设定(configuration) 019 1.9可能令你困惑的c++ 语法 026 1.9.1 stl_config.h 中的各种组态 027 组态3:static template member 027 组态5...

    STL 源码剖析(侯捷先生译著)

    内容简介回到顶部↑这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚...

    浅谈c++ stl迭代器失效的问题

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

    C++标准模板库map的常用操作

    map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能。 命名空间为std,所属头文件&lt;map&gt; 注意:不是&lt;map&gt; 二:常用操作 容量: a.map中实际数据的数据...

    刷leetcode不用stl-leetcode:leetcode

    erase()做的 122 买卖股票的最佳时机 利润最大化就是每次波谷买入波峰卖出 189 旋转数组 暴力法 一次挪一步 挪k次 超时 STL reverse() 217 判断是否存在重复元素 方法一 暴力法 时间复杂度 : O(n^2) 方法二 排序 ...

    hash_map:C++ STL 哈希映射容器

    STL hash_map: 链式散列 版权所有 (c) 2014,龙 (Ryan) 南宫。 保留所有权利。 邮箱: 创建时间:2014 年 7 月 15 日 这是无序的哈希映射,它具有恒定的插入、删除、搜索时间,并支持向前/向后迭代。 hash_map 的...

    C++STL程序员开发指南【可搜索+可编辑】

    1-1-4 动态内存分配运算符的使用....................................... 6 1-1-5 弓I 用(References) 类型, ··················•················•"'''8 1-1-6 const 语义的...

    C++ STL list 遍历删除出错解决方案

    C++ STL list 遍历删除崩溃 错误用法一 下面这种用法会在for的地方崩溃,分析 第一次for循环的时候 it=0,当t.erase(it)执行完成之后 it就变成了 -17891602 表明it不能再作为迭代器进行运算,自然会报错。 #...

    LRU:用于列表的轻量级 LRU 缓存结构和地图容器。 用 C++11 编写

    这两种结构都是ostream友好的并且匹配 STL std::list成员 API( cbegin 、 begin等)。 通过在运行时调用.resize(N)到所需的N元素来指​​定缓存限制。 如果N小于.size()尾部的值将被截断。 .insert(K)或.insert(K,...

    数据结构与算法分析

     3.3.2 示例:对表使用erase   3.3.3 const_iterator   3.4 向量的实现   3.5 表的实现   3.6 栈ADT   3.6.1 栈模型   3.6.2 栈的实现   3.6.3 应用   3.7 队列ADT   3.7.1 ...

    数据结构与算法分析C描述第三版

     3.3.2 示例:对表使用erase   3.3.3 const_iterator   3.4 向量的实现   3.5 表的实现   3.6 栈ADT   3.6.1 栈模型   3.6.2 栈的实现   3.6.3 应用   3.7 队列ADT   3.7.1 队列模型 ...

    leetcode跳跃-leetcode:讨论区答案搬运工

    预备知识:map、unordered_map、priority_queue、queue、set、stack、pair、list 1.1 LeetCode533 孤独像素 II 1.2 LeetCode060 第k个排列 vector 删除指定索引的元素 vector nums; auto it = begin(nums); // ...

Global site tag (gtag.js) - Google Analytics