Я новичок в 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;
}
foreach
для этого? - person Mat   schedule 23.12.2011foreach
, просто кажется, что его приятно использовать, и документы, похоже, предполагают, что есть какой-то способ сделать это. Qt кажется настолько хорошо продуманным, что я подумал, что будет какая-то очевидная идиома для того, что я пытаюсь сделать. - person Dan   schedule 23.12.2011