6

编码:

for(x=abc.begin();x!=abc.end();x++)  
{  
   if(-----)  
   {
      ----  
      abc.erase(x);  
   }
}

错误是 :::
Dangerous iterator usage
擦除后迭代器无效,因此取消引用它或将其与另一个迭代器进行比较是无效的。

在上述代码中使用擦除功能的错误用法是什么?

4

4 回答 4

7

从 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 的评论。

于 2011-03-14T07:21:33.610 回答
5

您在循环中使用 x 作为控制变量。由于它被 erase() 无效,因此您无法确定随后在循环顶部递增它是否安全(或有意义)。

于 2011-03-14T06:22:57.663 回答
4

x是指向abc. 删除 指向的项目后,应该指向x什么以及应该如何工作?xx++

于 2011-03-14T06:22:54.557 回答
1

您对正在迭代的容器只字未提。容器的类型取决于哪些迭代器无效。确保擦除元素的迭代器无效,但例如在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;
}
于 2011-03-14T09:57:59.163 回答