string类型对象erase操作迭代器不失效?
string str = "this IS A Example";
vector<char> cvec(str.begin(), str.end());
for(vector<char>::iterator iter = cvec.begin(); iter!= cvec.end(); ++iter){
if (isupper(*iter)){
cvec.erase(iter);//这里很迷惑 求达人帮助
--iter;
}
}
return 0;
[解决办法]
erase 返回删除后新区间的其实迭代器,赋值给 iter 了以后当然就不会再失效了。
[解决办法]
vector底层是连续内存,迭代器实际就是指针。
你1楼的写法虽说表面上看错误,实际运行时毫无问题的,因为你erase一个元素后,后面的内存会向前拷贝,也就是当前位置被填充为下一个元素,你先--iter,退到前一个位置,然后for的++又回到当前位置,所以是不会遗漏任何元素的,访问是正常的。