使用循环中的迭代器删除unordered_set中的元素

时间:2014-04-23 18:26:45

标签: c++ unordered-set

请考虑以下代码:

Class MyClass是一个自定义类:

class MyClass
{
public:
    MyClass(int v) : Val(v) {}
    int Val;
};

然后,在调用Debug Assertion Failed之后,以下代码将在循环中导致it = T.erase(it);

unordered_set<MyClass*> T;
unordered_set<MyClass*>::iterator it;

for (int i=0; i<10; i++)
    T.insert(new MyClass(i));

for (it = T.begin(); it != T.end(); it++)
{
    if ( (*it)->Val == 5 )
        it = T.erase(it); // After this line executes, in the next loop, the error occurs.
}

如何解决它,为什么? PS:我的环境:VS2010

2 个答案:

答案 0 :(得分:4)

假设最后一个元素的Val = 5。

调用

it = T.erase(it)it设置为T.end()

然后调用it++,这会导致错误,因为it已设置为结束。

基本上......当你擦除当前代码中的元素时,最终会使迭代器双倍前进。

你可以选择这样的东西......

for (it = T.begin(); it != T.end(); (*it)->Val == 5? it = T.erase(it) : ++it)
  ;

答案 1 :(得分:1)

这就是我通常做的事情:

for (auto it = T.begin(); it != T.end(); )
{
    if ((*it)->value == 5) it = T.erase(it);
    else ++it;
}

如果擦除条件变得更复杂,这可能会提高可读性。