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

来源:互联网 发布:ug编程教程百度云 编辑:程序博客网 时间:2024/05/16 11:02

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

      本博客转载自:http://blog.csdn.net/wangshubo1989/article/details/50121059和http://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 0