C++之vector的erase使用

一、定义

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 - 蓝天飞翔的白云 - 博客园

  • 16
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在C++中,vectorerase函数用于删除vector中的一个或多个元素。其语法为: iterator erase (iterator position); iterator erase (iterator first, iterator last); 第一种使用方式是删除指定位置的元素,指定的位置由参数position确定。该函数返回一个指向被删除元素之后元素的迭代器。 第二种使用方式是删除[first, last)范围内的所有元素,其中first和last是两个迭代器,分别指向要删除的范围的第一个元素和最后一个元素的下一个位置。该函数返回一个指向被删除元素之后元素的迭代器。 需要注意的是,在使用erase函数删除元素后,要小心迭代器的更新问题。删除一个元素后,迭代器会失效,所以在继续使用迭代器之前,要先更新迭代器。 对于上述提供的代码,其中的错误是在使用erase函数后未更新迭代器,导致迭代器指向了已删除元素的位置,产生了野指针的问题。正确的做法是在调用erase函数后,将迭代器更新为erase函数返回的新的迭代器。 引用中的代码漏掉了返回结果,并且在迭代器更新时没有进行自增操作,导致死循环。正确的代码应该修改为: vector<int> fun(vector<int>& vec) { vector<int> temp; for(auto iter=vec.begin(); iter!=vec.end(); ) { auto iter1=find(vec.begin(),iter,*iter); if(iter==iter1) { temp.push_back(*iter); iter = vec.erase(iter); } else { ++iter; } } return temp; } 引用中指出了代码存在的问题,即在erase后未更新迭代器的状态,导致出现野指针的错误。 引用中提供了一个错误的使用实例,其中的for循环中,在使用erase函数删除元素后,未更新迭代器的状态,导致迭代器指向已删除元素的位置。正确的做法是在调用erase函数后,将迭代器更新为erase函数返回的新的迭代器,可以通过将它赋值给迭代器来实现。 综上所述,C++中的vector erase函数用于删除vector中的元素,但需要注意更新迭代器的状态,以避免出现野指针的错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【C++】vectorerase用法](https://blog.csdn.net/Vcrossover/article/details/106243627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++之vectorerase使用](https://blog.csdn.net/sinat_31608641/article/details/108478756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值