我找不到如何做到这一点的实例,所以我希望有人能帮助我。我有一个在类中定义的地图如下:带删除的C++映射迭代
std::map<std::string, TranslationFinished> translationEvents;
TranslationFinished是boost :: function。我有一个方法,我的课的一部分,通过这个地图迭代,调用每个功能,如下所示:
void BaseSprite::DispatchTranslationEvents()
{
for(auto it = translationEvents.begin(); it != translationEvents.end(); ++it)
{
it->second(this);
}
}
但是有可能为一个由it->second(this);
调用的函数从translationEvents地图上删除元素(通常本身使用下面的函数):
bool BaseSprite::RemoveTranslationEvent(const std::string &index)
{
bool removed = false;
auto it = translationEvents.find(index);
if (it != translationEvents.end())
{
translationEvents.erase(it);
removed = true;
}
return removed;
}
这样做会导致调试断言失败时DispatchTranslationEvents()
试图递增迭代器。有没有一种方法可以在迭代过程中调用函数调用可能从地图中移除元素的可能性,从而安全地遍历地图?
在此先感谢
编辑:意外C /钯错误的移除事件代码。现在修复。
C#的集合类在这方面很糟糕。如果他们被修改,他们将使所有*失效。 C++容器在这方面的表现通常要好得多,并且通常只会使特定的迭代器无效,因此您可以在迭代时删除 – jalf 2011-04-15 06:42:05