stl的vector,map,list删除元素
2012-12-28 16:29
791 查看
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;
}
数据定义
#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;
}
相关文章推荐
- C++/STL用erase删除元素(vector,deque),(list,set,map)
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- vector, list, map在遍历时删除符合条件的元素实现方法
- C++/STL_利用remove_if 删除vector,list,deque满足条件的元素
- 如何在遍历list,vector,map时删除符合条件的元素
- 如何在遍历list,vector,map时删除符合条件的元素
- vector iterators incompatible 删除map,list中元素时,应注意的问题
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- vector list map 遍历删除指定元素
- 如何在遍历list,vector,map时删除符合条件的元素
- vector list map 遍历删除制定元素 防止迭代器失效的实例
- vector, list, map在遍历时删除符合条件的元素
- STL中map/vector的删除元素操作
- vector list map 遍历删除制定元素 防止迭代器失效
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)
- 循环删除vector和map中的元素
- 遍历list或map时删除元素(较巧妙)
- C/C++--STL中list,vector,deque,map,set区别、联系和使用场景
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL中的常用的vector,map,set,sort, list用法笔记(转)