Я не совсем уверен, в чем вопрос: название говорит о «картах карт», но я не вижу ничего в коде примера.
Кроме этого: что должно произойти, еслиэлемент был удален функцией?Вы хотите перезапустить итерацию с самого начала или продолжить с того места, где остановились (зная, что там, где вы остановились, возможно, были удалены карты)?Во-первых, ваш код в основном правильный, и я не думаю, что есть лучшее решение;по крайней мере, я не могу думать об одном от руки.Во-вторых, я думаю, вы хотели бы что-то вроде:
iter = map.begin();
while ( iter != map.end() ) {
key = iter->first;
// call function...
iter = map.upper_bound( key );
}
Это, наверное, самое простое решение.map.upper_bound
равно O(lg n)
, однако;если карта большая, это может быть проблемой.В зависимости от реализации map
(и частоты, с которой ваша функция удаляет элементы), использование ++
на итераторе, если ничего не было удалено с карты, может быть быстрее.
Конечно, если выЕсли вы можете гарантировать, что рассматриваемая функция никогда не удалит элемент после того, на котором вы находитесь, вы можете увеличить итератор перед вызовом функции.Однако решение с upper_bound
работает безоговорочно, независимо от того, какая функция изменяется на карте.