编码:
for(x=abc.begin();x!=abc.end();x++)
{
if(-----)
{
----
abc.erase(x);
}
}
错误是 :::
Dangerous iterator usage
擦除后迭代器无效,因此取消引用它或将其与另一个迭代器进行比较是无效的。
在上述代码中使用擦除功能的错误用法是什么?
从 abc 中删除对应的值后,迭代器 x 无效。这应该解决它:
x = abc.begin();
while(x != abc.end())
{
if (-----)
{
----
x = abc.erase(x);
// skipped only to next item
}
else
{ // skip only to next item
++x;
}
}
STL 容器的erase
模板函数返回下一个元素,或end()
。
编辑:感谢 templatetypedef 的评论。
您在循环中使用 x 作为控制变量。由于它被 erase() 无效,因此您无法确定随后在循环顶部递增它是否安全(或有意义)。
x
是指向abc
. 删除 指向的项目后,应该指向x
什么以及应该如何工作?x
x++
您对正在迭代的容器只字未提。容器的类型取决于哪些迭代器无效。确保擦除元素的迭代器无效,但例如在std::vector
所有迭代器中,过去擦除的元素将无效(包括end()
)。并且由于未知原因,尽管set::erase
仅使擦除元素的迭代器无效,但它不会将迭代器返回到下一个元素。
所以用std::set
:
while (x != abc.end()) // end() will not change and even can be stored
{
if (...)
abc.erase(x++); // increments before erasing
else
++x;
}