Вступить в клуб →
средняявопросSTL и контейнеры

Удаление элементов из map внутри цикла

Сервис чистит карту сессий с нулевым счётчиком:

for (auto it = sessions.begin(); it != sessions.end(); ++it) {
    if (it->second.refs == 0) {
        sessions.erase(it);
    }
}

Периодически процесс падает или зацикливается. Что здесь неверно?

  • Нельзя менять `std::map` во время обхода вообще: сначала соберите ключи, потом удаляйте — других вариантов нет
  • Ошибка в условии выхода: `end()` пересчитывается на каждой итерации, из-за чего цикл не завершается
  • `erase` по итератору удаляет весь поддиапазон до конца контейнера, поэтому теряются лишние элементы
  • После `erase(it)` итератор `it` недействителен, и следующий `++it` — неопределённое поведение

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела