首页 > 学院 > 开发设计 > 正文

vector之erase()

2019-11-10 18:07:52
字体:
来源:转载
供稿:网友

vector之erase()

vector的erase()是需要我们特别注意的。当调用erase()后,删除元素的指针变成了野指针,这时很容易发生错误,比如越界或者获取的值不是我们要的值。

解决办法,调整访问迭代器

从下列代码及其输出我们发现,A处发生了访问错误,所访问的值并不是我们所期望的 值。在对i调整后即 a.begin()+i调整了访问迭代器,使我们能够访问到我们所期望的值。

调用erase(a.begin()+i)后,删除了第i个元素,i后的元素前移动一位,不过不调整i,正如A 处的代码,我们将访问的是原来i+2的元素,而i+1的元素因为erase()移动到了原来i的位 置,这样就造成,访问丢失,解决办法,见代码B。

图例 erase()

结论:使用erase()后的循环访问要谨慎,应正确理解erase()的工作原理。

code:

#include<iostream>#include<vector>using namespace std;vector<int>a;int main(){ for(int i=0;i<10;i++) { a.push_back(i); } int j=0; //调用erase()后a.size()发生了变化 for(int i=0;i<a.size();i++)//+++++++++++++++A { cout<<a.at(i)<<endl; if(i>3) { //删除的是原来 i i+1 i+2出的元素 a.erase(a.begin()+i); } } cout<<"-------------------------"<<endl; a.clear(); for(int i=0;i<10;i++) { a.push_back(i); } for(int i=0;i<a.size();i++)//++++++++++++++++++B { cout<<a.at(i)<<endl; if(i>3) { a.erase(a.begin()+i); //通过调整i,访问到了原来所有的元素,尽管a.size()在一直变化。 //删除的总是同一位置上的元素 i--; } } return 0;} /*output: 0 1 2 3 4 6 8 ------------------------- 0 1 2 3 4 5 6 7 8 9 */参考 vector::erase Iterator validity Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表