请考虑以下代码:
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
答案 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;
}
如果擦除条件变得更复杂,这可能会提高可读性。