一、定义

vector::erase 从指定容器删除指定的元素

两个重载:

iterator erase (iterator position);
删除指定位置position的元素,并返回删除元素的下一个元素的迭代器

	iterator erase(iterator position){//清除某个位置上的元素
	if(position+1!=end())
	copy(position+1,finish,position);//后续元素向前移动
	--finish;
	destory(finish);//全局函数
	return position;
	}

 iterator erase (iterator first, iterator last);
删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器

//清除[ first,last)中的所有元素
iterator erase(iterator first, iterator last)
{  
   iterator i=copy(last,finish,first);//copy是全局函数
   destroy(i, finish);// destroy是全局函数
   finish = finish-(last - first);
   return first;


}

二、实例

我们要删除数组中的某个数字,比如删除300,有如下三种写法

2.1、错误的使用实例

vector<int>array;
  array.push_back(100);
  array.push_back(300);
  array.push_back(300);
  array.push_back(300);
  array.push_back(300);
  array.push_back(500);
  vector<int>::iterator itor;
  for (itor = array.begin(); itor != array.end(); itor++){
    if (*itor == 300) 
          array.erase(itor);//直接删除等于300的元素
  }

  for (itor = array.begin(); itor != array.end(); itor++)
  {
    cout << *itor << " ";
  }

运行结果

以上代码是错误的,因为删除一个元素之后,迭代器已经指向了被删除元素的下一个元素,再进行itor++会出现野指针。也就是说array.erase(itor)后,itor的状态是不确定的,再进行++,岂有不崩溃的道理?!

2.2错误的使用实例

vector<int>array;
  array.push_back(100);
  array.push_back(300);
  array.push_back(300);
  array.push_back(300);
  array.push_back(300);
  array.push_back(500);
  vector<int>::iterator itor;
  for (itor = array.begin(); itor != array.end(); itor++){
    if (*itor == 300)  itor=array.erase(itor);
  }

  for (itor = array.begin(); itor != array.end(); itor++)
  {
    cout << *itor << " ";
  }

运行结果

还是不对,结果发现是100 300 300 500,因为itor指向删除元素下一个元素后,itor++就跳过了删除元素,而指向下一个元素。

2.3正确的写法

vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for (itor = array.begin(); itor != array.end(); ){
        if (*itor == 300) 
        {
            itor=array.erase(itor);
        }
        else
        {
            itor++;
        } 
    }
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        cout << *itor << " ";
    }

运行结果

也就是说如果没有erase操作,再将迭代器指向下一个元素。

参考:

C++序列式容器vector_sinat_31608641的博客-CSDN博客

vector erase - 蓝天飞翔的白云 - 博客园

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐