Я не мог найти пример, как это сделать, поэтому я надеялся, что кто-то сможет мне помочь. У меня есть карта, определенная в классе следующим образом:
std::map<std::string, TranslationFinished> translationEvents;
TranslationFinished - это функция boost::. У меня есть метод как часть моего класса, который выполняет итерацию через эту карту, вызывая каждую из следующих функций:
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 неправильно удалить код события. Исправлено.