没有躲过的坑--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移动指定区间中的元素直到所有“不删除的”元素在区间的开头(相对位置和原来它们的一样)。它返回一个指向最后一个的下一个“不删除的”元素的迭代器。返回值是区间的“新逻辑终点”。
- 没有躲过的坑--vector使用erase后迭代器变成野指针
- 没有躲过的坑--vector使用erase后迭代器变成野指针
- 没有躲过的坑--智能指针陷阱
- 没有躲过的坑--正确释放vector的内存
- 没有躲过的坑--指针(内存泄露)
- 没有躲过的坑--使用太多的全局变量
- 关于vector的erase使用
- 没有躲过的坑--deprecated关键字
- 没有躲过的坑--重定义关键字
- 没有躲过的坑--new一个指针数组、以及创建动态二维数组
- 没有躲过的坑--没有及时break出for循环
- 没有躲过的坑--成对使用new和delete时要采取相同的形式
- 没有躲过的坑--使用using namespace std的坏习惯
- 判断线段相交 + vector. erase迭代指针 的使用 poj 2653 Pick-up sticks
- VC2008中Vector的erase使用
- STL Vector remove()和erase()的使用
- STL Vector remove()和erase()的使用
- C++中vector::erase方法的使用
- Linux安装PHP MongoDB扩展(亲测)
- 三极管那点事
- mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...
- 【计算机算法分析】动态规划法——矩阵连乘问题
- 用github部署web应用
- 没有躲过的坑--vector使用erase后迭代器变成野指针
- Floyd算法 POJ2502
- GK Summay算法(ϵ−approximate ϕ−quantile)
- 【雅思备考】Task2——怎样写介绍段
- 【雅思备考】Task2——总纲领
- PHP笔记
- 识别边界类/控制类/实体类
- Linux搭建svn控制
- [BZOJ4712]洪水-树链剖分-动态规划-线段树