转载于 http://www.cnblogs.com/graphics/archive/2010/07/05/1771110.html

    http://hi.baidu.com/sdkinger/item/dcad78e374707ff12b09a453

一、

#include <iostream>
#include <map>
#include <string>
using namespace std ;int main(void)
{ map<int, string> m ;m.insert(pair<int, string>(1, "abc")) ;m.insert(pair<int, string>(2, "def")) ;m.insert(pair<int, string>(3, "def")) ;m.insert(pair<int, string>(4, "ghi")) ;map<int, string>::iterator itor ;// 错误的写法for (itor = m.begin(); itor != m.end(); ++itor){if (itor->second == "def"){m.erase(itor) ; // map是关联式容器,调用erase后,当前迭代器已经失效
        }}// 正确的写法for (itor = m.begin(); itor != m.end();){if (itor->second == "def"){m.erase(itor++) ; // erase之后,令当前迭代器指向其后继。
        }else{++itor;}}// 另一个正确的写法,利用erase的返回值,注意,有些版本的stl-map没有返回值,比如SGI版,但vc版的有for (itor = m.begin(); itor != m.end();){if (itor->second == "def"){itor = m.erase(itor) ; // erase的返回值是指向被删除元素的后继元素的迭代器
        }else{++itor;}}// Print mmap<int, string>::const_iterator citor ;for (citor = m.begin(); citor != m.end(); ++citor){cout << citor->first << ":" << citor->second << endl ;}getchar() ; return 0 ;
} 

二、

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);
}

注意:

map的earse应注意:
map这种容器的下边访问和Vector等容器的下标访问有本质的区别。 
对于Vector容器,用aVector[i]访问第i个元素时,如果元素不存在,容器不会增加元素, 
而对于map,用aMap[key] 
访问键key对应的对象时,如果该键对应的对象存在,则返回该对象(这和Vector一样),但是,当键值为key的元素不存在时,容器会自动的增加一个pair,键为key,而值则为一个容器定义时指定的类型并默认初始化(即,如果该类型为基本类型,则初始化为0,比如本例中,aMap[1]的使用会产生一个pair,<1,NULL>,若该类型为类类型,则调用默认构造函数初始化之)

显然,本例中,aMap[1]为NULL,后面的erase()不会执行,使得后面的 
插入语句aMap.insert(1,new A())键值冲突

eg:如下代码会导致错误

#include <iostream> 
#include <map>

using namespace std;

struct A 

A(int i) 

x=i; 

int x; 
};

int main() 

map<int,A*> amap; 
if ( amap[1] != NULL ) 
amap.erase(1); 
amap.insert(make_pair(1,new A(1))); 
amap.insert(make_pair(2,new A(2))); 
amap.insert(make_pair(3,new A(3))); 
return 0; 
}

转载于:https://www.cnblogs.com/hello-yz/p/3235187.html

map中的erase成员函数用法相关推荐

  1. python中all函数的用法_python中map、any、all函数用法分析

    这篇文章主要介绍了 python 中 map . any . all 函数用法 , 实例分析了 map . any . all 函数 的相关使用技巧 , 具有一定参考借鉴价值 , 需要的朋友可以参考下 ...

  2. C++ 常用容器成员函数用法总结

    C++ 常用容器成员函数用法总结 C++ 常用容器成员函数用法总结 简介 迭代器 简介 array: 静态数组 简介 构造函数 访问 / 赋值 迭代器 下标 / at 批量赋值 swap (交换函数) ...

  3. C++string类常用函数 c++中的string常用函数用法总结

    string类的构造函数: string(const char *s);    //用c字符串s初始化 string(int n,char c);     //用n个字符c初始化 此外,string类 ...

  4. CString的成员函数用法大全

    CString的成员函数用法大全(转) PS:来自 https://www.cnblogs.com/Caiqinghua/archive/2009/02/16/1391190.html 写的很好! C ...

  5. python threading join_Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后joi ...

  6. C++中的const成员函数

    文章目录 1 C++中的const成员函数 1.1 const成员函数的使用 1.2 同名的const成员函数和非const成员函数构成重载关系 2 mutable关键字 1 C++中的const成员 ...

  7. getservbyname php,php中getservbyport与getservbyname函数用法实例

    本文实例讲述了php中getservbyport与getservbyname函数用法.分享给大家供大家参考.具体如下: string getservbyport ( int $port , strin ...

  8. 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

    将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由 ...

  9. dojo——AMD(二、AMD中class内部成员函数相互调用实现)

    一.引言 这两天写arcgis javascript代码的时候,自己以为对dojo的amd规范掌握了,可是后来碰到了一个问题,在每个module中成员函数调用另外一个成员函数必须使用this调用(这点 ...

最新文章

  1. ecshop商城首页怎样设置广告ALT标签
  2. Microsoft 数据访问组件 (MDAC) 的版本历史记录
  3. 1736: 反射-含某个字符的子串的查找
  4. 如何得到webbrowser的句柄
  5. python 中的列表中最大数怎么求_python 找出list中最大或者最小几个数的索引
  6. jsp后台批量导入excel表格数据到mysql中_运用java解析excel表,拿到表中的数据并批量插入数据库...
  7. 射频电路设计——射频器件基础
  8. 蓝桥杯python青少年_让孩子参加蓝桥杯大赛好吗
  9. d3.drag使用指南
  10. android 拨打电话 发送短信 权限,Android中发送短信和拨打电话
  11. 计算机恢复出场设置,小白教你电脑恢复出厂设置
  12. c语言指针选择题库及答案,C语言指针练习习题及答案.doc
  13. [读书笔记] 蔡康永的说话之道
  14. 【图像】焦距与景深的关系
  15. img固定宽高,图片等比缩小不变形
  16. JVM 栈分配与TLAB
  17. postman传布尔类型的值传不进去
  18. 既已开始,就风雨兼程
  19. macOS 更新Xcode,UE4编译C++报错variable “LayerNames” set but not used -Wunused-but-set-variable解决方案
  20. cass常用命令快捷键

热门文章

  1. Solr4.7实现LBS(地理位置搜索)
  2. 信息树和XML文件的遍历及XML文件的应用
  3. JAVA操作MYSQL数据库
  4. 微信小程序注意点及快捷键
  5. 运维调试记录:Opendaylight铍版本开发环境搭建流程
  6. 你不知道的shell用法和脚本,简单强大
  7. javascript闭包-全局变量与局部变量
  8. Linux web服务安装apache 思路 (源码编译,自己定义服务)
  9. apache2 指令存取
  10. Promise 化回调式函数