Я новичок в 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;
}