2013-03-13 关于标准库中map的erase()方法
来源:互联网 发布:淘宝漏洞刷q币 编辑:程序博客网 时间:2024/06/05 23:54
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的这个用法,我在打印服务器的数据库连接池中曾经使用了本文中列出的错误例子,导致程序在释放数据库连接的时候崩溃,在windows日志中总是报错.
- 2013-03-13 关于标准库中map的erase()方法
- 关于map的erase方法的使用
- 关于map::erase的使用说明
- Linux与Windows中map类erase方法的差异
- Linux与Windows中map类erase方法的差异
- Linux与Windows中map类erase方法的差异
- 标准C++库vector类erase方法的小bug
- 正确运用stl map的erase方法
- 正确运用stl map的erase方法
- 正确运用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确运用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 正确使用stl map的erase方法
- 简单的计算器------加减乘除
- Device Driver 驱动程序
- gcc实践(1): warning: suggest parentheses around assignment used as truth value [-Wparentheses]
- HDU 1274 展开字符串
- C#窗体定时执行任务
- 2013-03-13 关于标准库中map的erase()方法
- 设计模式之工厂方法
- POJ --2528--Mayor's posters--离散线段树
- 百钱百鸡:公鸡5元一只,母鸡3元一只,小鸡1元3只,100元要买100只鸡,共有几种情况
- C++中的局部变量和全局变量的区分
- Ajax复习
- 获取CPUID
- 外贸企业海外推广搜索引擎营销方法
- ThinkPHP学习笔记(二)——(读取数据)