版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p1126500468/article/details/80318902
今天使用容器删除元素操作时出现runtime error
auto it1 = ivec.begin();
while (it1 != ivec.end()){
if (*it1 % 2 == 0)
ivec.erase(it1);
++it1;
}
几行代码,第一次使用容器的erase删除操作,本意是从头到尾遍历一遍容器,如果满足
*it1 % 2 == 0的条件就执行操作,并且将it1指针加一指向下一元素,结果报错:
仔细研读了一下erase,发现erase有个返回值,指向删除的元素的后一个位置的迭代器。并且执行erase后会导致删除点以后的迭代器、引用和指针都会失效,所以运行到++it1就出错了。
以后应特别注意容器会引起迭代器失效的各种情况。
所以正确做法:
auto it1 = ivec.begin();
while (it1 != ivec.end()){
if (*it1 % 2 == 0)
it1=ivec.erase(it1); //注意此处
++it1;
}
参考:https://blog.csdn.net/keyboardfucker/article/details/52069066