vector
两种重载
(1)iterator erase( iterator _Where);
(2)iterator erase( iterator _First, iterator _Last); erase()返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
错误情况:
{ for(Iter = v1.begin(); Iter != v1.end(); Iter++)
if(*Iter == 10)
{
v1.erase(Iter);
}
}
当调用erase()后Iter迭代器就失效了,变成了一野指针。
看似一定正确的改正方法:
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
{
if(*Iter == 1)
{
Iter = v1.erase(Iter);
//当erase后,旧的容器会被重新整理成一个新的容器
}
此种写法有两个问题:(1)不能连续删除同一个数值(本例为1) ;(2)如果删除的为最后一个值,Iter指向end(),再++ 就出错了。
解决办法:
for(Iter = v1.begin(); Iter != v1.end(); )
{
if(*Iter == 1) Iter = v1.erase(Iter);
else Iter++;
}
map
map中有三种重载
c++11 后map中erase有返回值
(1)iterator erase(iterator position);
(2)size_type erase(const key_type& x); // 这个如果size_type为int,则返回值为1时代表删除成功,为0代表删除失败。
(3)iterator erase(iterator first, iterator last); // 相当于map.clean()。
出现错误的情况
map是关联式容器,调用erase后,当前迭代器已经失效
std::map<int, int> mmap;
mmap[0] = 0;
mmap[1] = 1;
mmap[2] = 2;
mmap[3] = 3;
std::map<int, int>:: iterator it = mmap.begin();
for( ; it!=mmap.end(); it++)
{
if(it->first == 2)
{
mmap.erase(it); //执行后,it失效,程序崩溃。
}
}
正确解法
第一种
for( ; it!=mmap.end(); )
{
if(it->first == 2)
{
mmap.erase(it++);
}
else it++;
}
第二种
for( ; it!=mmap.end();)
{
if(it->first == 2)
{
it = mmap.erase(it);
}
else it++;
}