Итерация карты 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 / Pd неправильный код удаления события. Сейчас исправлено.

13
задан BЈовић 15 April 2011 в 06:15
поделиться