vector中erase后迭代器回退
小弟再看C++primer顺序容器时,写代码时出错了。
- C/C++ code
//删除vector中的偶数 for (vector<int>::iterator ix1=vec1.begin();ix1!=vec1.end();ix1++) { if ((*ix1)%2==0)//偶数 { ix1=vec1.erase(ix1); //cout<<*ix1<<endl;//此时的ix1已经是下一个元素的迭代器了 //--ix1;//这样迭代器回退不行??? } }
由于vector内存分配时是连续存放的,用erase删除元素后后面的元素自动向前移动,所以返回指向删除元素的下一个元素的迭代器,由于for(...;ix1++)所以迭代器应该回退。但是
ix1=vec1.erase(ix1);
--ix1;
这样出错了。为什么呢?
如果用
- C/C++ code
for (vector<int>::iterator ix1=vec1.begin();ix1!=vec1.end();) { if ((*ix1)%2==0)//偶数 { ix1=vec1.erase(ix1);//返回指向删除元素的下一个元素的迭代器 } else ix1++; }
就通过了。是不是删除一个元素后地址发生变化此时迭代器回退得到的是一个野指针???求高手指教。
[解决办法]
我试着解答下:
函数从0号开始判断,判断成功(TRUE),删除0号,迭代器指向了原1号,也就是新的0号,如果此时你让迭代器自减1,等于指向了新的-1号,能不出错么?
呵呵,不知道我答对了没,我也是个新手。
[解决办法]
- C/C++ code
//删除vector中的偶数 for (vector<int>::iterator ix1=vec1.begin();ix1!=vec1.end();) { if ((*ix1)%2==0)//偶数 { ix1=vec1.erase(ix1); //cout<<*ix1<<endl;//此时的ix1已经是下一个元素的迭代器了 //--ix1;//这样迭代器回退不行??? }else ix1++; }