Блог пользователя nic11

Автор nic11, 11 лет назад, По-русски

У меня есть некий map. Пробегаюсь я по нему циклом. И мне надо прямо в цикле уметь удалять элементы из map без потери хода цикла. Многое пробовал написать, все быдлокод получался, который вдобавок еще и не работает. Подскажите, пожалуйста, как лучше всего это реализовать?

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Я обычно пишу так (тоже некрасиво, да):

for (auto it = m.begin(); it != m.end();) {
  auto nit = it++;
  // do some stuff with 'it'
  it = nit;
}

Здесь предлагают чуть по-другому:

for (auto it = m.begin(); it != m.end();)
  if (delete_condition)
    m.erase(it++);
  else
    it++;

Можно скомбинировать, получится почти красиво:

for (auto _it = m.begin(); _it != m.end();) {
  auto it = _it++;
  // do some stuff with 'it'
}
  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо :)

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    В С++11 метод erase возвращает итератор на следующий элемент, так что совсем красиво это:

    for (auto it = m.begin(); it != m.end();) {
      if (delete_condition)
        it = m.erase(it);
      else
        it++;
    }
    

    К сожалению в стандарте C++98 этот метод возвращает void, но в некоторых компиляторах эта функциональность всё же есть.