没有躲过的坑--vector使用erase后迭代器变成野指针

没有躲过的坑--vector使用erase后迭代器变成野指针以及remove和erase的区别

      本博客转载自:http://blog.csdn.net/wangshubo1989/article/details/50121059http://blog.csdn.net/vbanglev/article/details/1512521并做了适当修改。

      vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。

      erase–return value
      首先需要明确一下vector的两种erase:
      C++98中是这样的:

iterator erase (iterator position);
iterator erase (iterator first, iterator last)
      C++11中是这样的:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
      我们使用下面的代码进行erase:
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  // set some values (from 1 to 10)
  for (int i=1; i<=10; i++) myvector.push_back(i);

  // erase the 6th element
  myvector.erase (myvector.begin()+5);

  // erase the first 3 elements:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}
/*--------------------------------------
Output:
myvector contains: 4 5 7 8 9 10
---------------------------------------*/
      上面的代码非常的完美,但是当把ease用于for循环的时候,就完蛋了:
for(vector<int>::iterator iter=vector_database.begin(); vector_database!=veci.end(); iter++)
{
      if( *iter == 10)
      {
          vector_database.erase(iter);
      }
}
      当执行veci.erase(iter)后,迭代器iter指向了哪里?

      也就是说veci.erase(iter)后,iter的状态是不确定的,成为了野指针!!!再进行++,岂有不崩溃的道理!!
      解决方法是利用erase()函数的返回值对iter重新赋值就好了。
      remove or erase? (这里简单说一下。。)
      很多人还用到过remove,但是对于很多人不能分清楚remove和erase的区别?
      STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
      vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size
      vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size

      非常简要地说一下,remove移动指定区间中的元素直到所有“不删除的”元素在区间的开头(相对位置和原来它们的一样)。它返回一个指向最后一个的下一个“不删除的”元素的迭代器。返回值是区间的“新逻辑终点”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值