stl之map

stl之map erase方法的正确使用

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; 



容器erase的时候不会释放的指针指向的内存

2009年5月6日 星期三一切看代码
主要是想用map管理无模式对话框,但不知道map erase的时候会不会释放掉内存。用map测试下。







class A
{
public:
A(int _x,int _y){x =_x; y =_y;}

public:
int x;
int y;
};
typedef map<string,A*> stringAMap;





int main()
{
stringAMap map1;
A* a = new A(100,200);
map1.insert(make_pair("韦宇浩",a));
map1.insert(make_pair("陆一峰",new A(200,300)));
stringAMap::iterator pos;
pos = map1.find("韦宇浩");

if (pos != map1.end())
{
map1.erase(pos);
}
cout << a->x;
return 0;

}

输出结果100
看结果 便知,没有释放掉内存。

原文地址:https://www.cnblogs.com/byfei/p/3112110.html