vector 和 map erase() 出错

1,378 阅读1分钟

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++;
    }