std::map::erase的用法及陷阱
2016-04-14 20:24
381 查看
方法一:
在这种方式中,通过std::map的erase方法在释放了it后会返回指向下一个元素的指针来获取最新的iterator。
方法二:
该方法中利用了后++的特点,这个时候执行mapTest.erase(it++);这条语句分为三个过程
1、先把it的值赋值给一个临时变量做为传递给erase的参数变量
2、因为参数处理优先于函数调用,所以接下来执行了it++操作,也就是it现在已经指向了下一个地址。
3、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。
如果只是mapTest.erase(it); 当这条语句执行完后,it就是一个非法指针,如果再执行++就会出错
总结,虽然上面两种方法达到了一个相同的效果,但是,更提倡使用第二种,第一种方法只适用于windows平台,并不是标准库的支持
std::map<std::string, std::string > mapTest; bool TestVal(const std::string & val); ...... std::map<std::string, std::string >::iterator it = mapTest.begin(); while(it != mapTest.end()) { if(TestVal(it->second)) { it = mapTest.erase(it); } else it++; } ...........
在这种方式中,通过std::map的erase方法在释放了it后会返回指向下一个元素的指针来获取最新的iterator。
方法二:
std::map<std::string, std::string > mapTest; bool TestVal(const std::string & val); ...... std::map<std::string, std::string >::iterator it = mapTest.begin(); while(it != mapTest.end()) { if(TestVal(it->second)) { mapTest.erase(it++); } else it++; } ...........
该方法中利用了后++的特点,这个时候执行mapTest.erase(it++);这条语句分为三个过程
1、先把it的值赋值给一个临时变量做为传递给erase的参数变量
2、因为参数处理优先于函数调用,所以接下来执行了it++操作,也就是it现在已经指向了下一个地址。
3、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。
如果只是mapTest.erase(it); 当这条语句执行完后,it就是一个非法指针,如果再执行++就会出错
总结,虽然上面两种方法达到了一个相同的效果,但是,更提倡使用第二种,第一种方法只适用于windows平台,并不是标准库的支持
相关文章推荐
- poj-1006-Biorhythms
- ionic入门教程第八课-(加更)从无到有说Ionic、画图说明MVC-U-S
- 3.9补
- (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解
- 20145313第二次实验
- IIS7 web app error : "Could not load type 'System.Security.Claims.ClaimsIdentity' from assembly
- mysql-5.6.30-winx64免安装配置
- 在Lua中计算含中文的字符串的长度
- AndroidStudioGuide的相关设置
- LeetCode Valid Parentheses
- 在Lua中计算含中文的字符串的长度
- 安卓007移动存储--文件
- 生产系统数据实时同步到rds数据仓库的一个样例
- 一道有意思的编程思考题:【妖怪和和尚过河问题】
- 3.8补
- 使用百度编辑器老是出现的错误
- Java之HashMap在非线程安全时的行为
- CF 82A Double Cola
- bitmap算法
- zoj3494AC自动机