标签 c++ unordered-set
请考虑以下代码:
Class MyClass 为自定义类:class MyClass
{
public:MyClass(int v) : Val(v) {}int Val;
};
然后下面的代码将在调用 it = T.erase(it); 之后在循环中导致 Debug Assertion Failed:
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
最佳答案:
假设最后一个元素的 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);
我通常是这样做的:
for (auto it = T.begin(); it != T.end(); )
{if ((*it)->value == 5) it = T.erase(it);else ++it;
}
如果擦除条件变得更复杂,这可能会提高可读性。
关于c++ - 在循环中使用迭代器删除 unordered_set 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252386/