解决办法,调整访问迭代器
从下列代码及其输出我们发现,A处发生了访问错误,所访问的值并不是我们所期望的 值。在对i调整后即 a.begin()+i调整了访问迭代器,使我们能够访问到我们所期望的值。调用erase(a.begin()+i)后,删除了第i个元素,i后的元素前移动一位,不过不调整i,正如A 处的代码,我们将访问的是原来i+2的元素,而i+1的元素因为erase()移动到了原来i的位 置,这样就造成,访问丢失,解决办法,见代码B。
图例
结论:使用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.新闻热点
疑难解答