stl的vector,map,list删除元素

vector看成数组,list看成链表,具体的内部存储方法可以参考stl


数据定义

#include <map>
 #include <vector>
 #include <list>
 
 using namespace std;
 
 typedef map<int, byte*> ByteMap;
 ByteMap  testMap;
 typedef	vector<int>		IntVec;
 IntVec   testVec;
 typedef list<int>		IntList;
 IntList	 testList;

遍历删除vector

	IntVec::iterator iter = testVec.begin();
 	for (; iter != testVec.end();)
 	{
 		iter = testVec.erase(iter);
 	}
 

遍历删除list

	IntList::iterator iter = testList.begin();
 	for (; iter != testList.end(); )
 	{
 		//testList.erase(iter++); //可行
 		iter = testList.erase(iter);
 	}
 

初始化map

	int nMem = 80;
 	int nNum = 4;
 	byte** by = new byte*[nNum];
 	for (int i = 0; i< nNum; i++)
 	{
 		by[i] = new byte[nMem];
 		memset(by[i], i, nMem);
 		testMap[i] = by[i];
 	}
 

遍历删除map

	ByteMap::iterator iter = testMap.begin();
 	while(iter != testMap.end())
 	{
 		byte* pb = (*iter).second;
 		if (pb)
 		{
 			delete []pb;
 			pb = NULL;
 		}
 		//testMap.erase(iter++);//都可以
 		iter = testMap.erase(iter);
 	}

注明:

testMap.erase(iter++)可以

改成testMap.erase(iter); iter++就不行,会在

		iterator operator++(int)
 			{	// postincrement
 			iterator _Tmp = *this;
 			++*this;
 			return (_Tmp);
 			}
 

崩溃。

大概前者会在++之前给iter建立一个缓存对象,之后再在此基础之上++,而后者erase之后iter就没有实际意义了。如下。

iter = (-17891602,0xfeeefeee <错误的指针>)


二维数组上级指针的内存释放,下级指针已经在map中释放了

	if (by)
 	{
 		delete []by;
 		by = NULL;
 	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值