Qt: возможно ли удаление элементов QList во время итерации с использованием макроса foreach?

Я новичок в Qt и пытаюсь изучить идиомы.

В документации foreach говорится:

Qt автоматически берет копию контейнера при входе в цикл foreach. Если вы измените контейнер во время итерации, это не повлияет на цикл.

Но здесь не сказано , как удалить элемент во время итерации с foreach . Мое лучшее предположение выглядит примерно так:

int idx = 0;
foreach (const Foo &foo, fooList) {
  if (bad(foo)) {
    fooList.removeAt(idx);
  }
  ++idx;
}

Ужасно иметь область видимости idx вне цикла (и вообще поддерживать отдельный счетчик цикла).

Кроме того, я знаю, что foreach создает копию QList , что дешево, но что происходит, когда я удаляю элемент - это все еще дешево или есть происходит дорогое копирование при изменении? Да, глубокое копирование происходит .

РЕДАКТИРОВАТЬ: Это тоже не похоже на идиоматический Qt.

for (int idx = 0; idx < fooList.size(); ) {
  const Foo &foo = fooList[idx];
  if (bad(foo)) {
    fooList.removeAt(idx);
  }
  else ++idx;
}

41
задан Top-Master 27 February 2019 в 08:10
поделиться