我找不到如何做到這一點的實例,所以我希望有人能幫助我。我有一個在類中定義的地圖如下:帶刪除的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