众所周知,容器删除元素会使当前使用的迭代器失效,除了重新分配迭代器,还可以使用下面的写法,使删除元素时重新赋值一个有效的迭代器
for(auto iter = v->begin();iter!=v->end();){
if(...){//判断条件
iter = v->erase(iter);//使用erase返回的迭代器重新赋值iter
}else{
iter++;
}
}
但是我在一个程序中使用了正确写法,还是遇到了vector iterator not incrementable
这个崩溃提示
原因就是我使用了嵌套的迭代器循环,大概的代码如下
void func(){
for(auto iter = v->begin();iter!=v->end();){
if(...){//判断条件
iter = v->erase(iter);//使用erase返回的迭代器重新赋值iter
}else{
iter++;
}
}
}
void funb(){
for(auto iter = v->begin();iter!=v->end();){
if(...){//判断条件
func();
}
}
}
这导致func里面是正常的迭代器循环,正常的删除了元素,而回到funb里面容器被改变了,导致迭代器失效!