C++ erase在for循环下的用法

以前就发现了vector中的erase方法有些诡异(_),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性。

vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             veci.erase(iter);
}

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

查看MSDN,对于erase的返回值是这样描述的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码:

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             iter = veci.erase(iter);
}

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

正确的代码应该为:

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
     if( *iter == 3)
          iter = veci.erase(iter); //返回值指向删除元素的下一个元素
      else
            iter ++ ;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,vector的erase函数用于删除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++】vector中erase用法](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++之vector的erase使用](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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值