cppcheck错误:危险的迭代器用法

ekl*_*lmp 4 c++ erase libstdc++

代码:

for(x=abc.begin();x!=abc.end();x++)  
{  
   if(-----)  
   {
      ----  
      abc.erase(x);  
   }
}
Run Code Online (Sandbox Code Playgroud)

错误是:::
Dangerous iterator用法
擦除后迭代器无效,因此解除引用或将其与另一个迭代器进行比较无效.

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

Sta*_*dog 5

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


har*_*per 5

从abc中删除相应的值后,itarator 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

eraseSTL容器的模板函数返回下一个元素,或end().

编辑:感谢templatetypedef的评论.