前几天刚写了一篇关于STL迭代器失效的博文(迭代器失效(1)-小心使用STL容器的erase() ),今天又犯了错误,原因是代码结构的复杂性掩盖了迭代器失效的事实。
现把代码层层简化,如下:
#include <vector>
std::vector<int> myVector;
void do_something();
void handleElement(int val);
int main()
{
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
myVector.push_back(4);
myVector.push_back(5);
do_something();
// handleElement(2);
return 0;
}
void do_something()
{
std::vector<int>::iterator it = myVector.begin();
for (;it != myVector.end(); it++)
{
handleElement(*it);
}
}
void handleElement(int val)
{
std::vector<int>::iterator it = myVector.begin();
while (it != myVector.end())
{
if (val == *it)
{
it = myVector.erase(it);
}
else
{
it++;
}
}
}
这段代码有问题吗?运行时直接segment fault。为什么?
迭代器失效了吗?没错,但不是在handleElement()里,而在do_something()。do_something()中,遍历容器元素的过程中,handleElement()删除了元素。
转载本文请注明作者和出处[Gary的影响力]http://garyelephant.me,请勿用于任何商业用途!
Author: Gary Gao 关注互联网、分布式、高并发、自动化、软件团队
支持我的工作: https://me.alipay.com/garygao