一个简单的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;

5个回答

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

zay999abc
霍天青 是我错了,请忽略。中文第五版。
5 年多之前 回复
wsh1992o
存钱买冰棍 回复zay999abc: 你用C++primer?第几版啊,怎么还会出错.我还想去弄本第5版过来看看
5 年多之前 回复
zay999abc
霍天青 谢谢。
5 年多之前 回复

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

zay999abc
霍天青 请忽略这个 。
5 年多之前 回复

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

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

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

zay999abc
霍天青 额,谢谢。我刚写完就知道自己错了,但是不能编辑,所以就这样了。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐