一个简单的C++练习,运行时显示“vector iteration incompatible"。

array ar = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
vector vec(ar.begin(), ar.end());
auto it = vec.begin();
while (it != vec.end())
{
if (*it % 2)
vec.erase(it);
else
it++;
}
for (auto i : vec)
cout << i;

你每次执行完vec.erase后,都要让it指向新的vec
把 vec.erase(it);
改为 it = vec.erase(it);

你的答案是正确的。《C++ Primer》》这本书上说v.erase(it)会返回被删除元素下一个元素的迭代器,看来是说错了。谢谢。

书没错,它确实会返回下一个迭代器,同时原来的迭代器会失效。所以你的方法有问题,因为循环会用老的迭代器,而改法就是自己保存新的迭代器。

你每次执行完vec.erase后,都要让it指向新的vec
把 vec.erase(it);
改为 it = vec.erase(it);

容器在erase以后,迭代器就会失效,所以iter = vec.erase(iter)就可以啦