您的位置:首页 > 其它

stl的vector,map,list删除元素

2012-12-28 16:29 711 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: