Я новичок в Qt и пытаюсь изучить идиомы.
В документации foreach
говорится:
Qt автоматически берет копию контейнера, когда он входит в цикл foreach. Если вы изменяете контейнер, когда выполняете итерацию, это не повлияет на цикл.
Но он не говорит, как удалить элемент во время итерации с помощью foreach
. Мое лучшее предположение - это что-то вроде:
int idx = 0;
foreach (const Foo &foo, fooList) {
if (bad(foo)) {
fooList.removeAt(idx);
}
++idx;
}
Кажется уродливым иметь область видимости idx
вне цикла (и вообще поддерживать отдельный счетчик циклов).
Кроме того, я знаю, что Да, происходит глубокая копия.foreach
делает копию QList
, что дешево, но что происходит, когда я удаляю элемент - это все еще дешево или есть дорогостоящий экземпляр, изменить?
EDIT: Это тоже не похоже на идиоматический Qt.
for (int idx = 0; idx < fooList.size(); ) {
const Foo &foo = fooList[idx];
if (bad(foo)) {
fooList.removeAt(idx);
}
else ++idx;
}