Jestem nowy w Qt i próbuję nauczyć się idiomów.Jak mogę usunąć elementy z QList podczas iteracji za pomocą foreach?
The foreach
documentation mówi:
Qt automatycznie wykonuje kopię pojemnika, gdy wchodzi do pętli foreach. Jeśli zmodyfikujesz kontener w trakcie iteracji, nie wpłynie to na pętlę.
Ale to nie znaczy jak aby usunąć element podczas iteracji z foreach
. Mój najlepszy przypuszczenie jest coś takiego:
int idx = 0;
foreach (const Foo &foo, fooList) {
if (bad(foo)) {
fooList.removeAt(idx);
}
++idx;
}
Wydaje brzydki musiał zakresu idx
zewnątrz pętli (i musiał utrzymać oddzielny licznik pętli w ogóle).
Również wiem, że Tak, deep copy happens.foreach
sprawia kopię QList
, który jest tani, ale to, co się dzieje, kiedy już usunąć element - jest to, że nadal tanie lub drogie jest tam kopia na modyfikowanie dzieje?
EDIT: To też nie wydaje się idiomatyczne Qt.
for (int idx = 0; idx < fooList.size();) {
const Foo &foo = fooList[idx];
if (bad(foo)) {
fooList.removeAt(idx);
}
else ++idx;
}
Dlaczego chcesz użyć 'foreach 'do tego? – Mat
@Mat, nie muszę używać 'foreach', to po prostu wydaje się być przyjemne w użyciu, a dokumenty wydawały się sugerować, że jest jakiś sposób, aby to zrobić. Wydaje mi się, że Qt jest tak dobrze przemyślany, że wydaje mi się oczywisty idiom dla tego, co próbuję zrobić. – Dan
Co z pustym QMutableListIterator :: remove()? http://developer.qt.nokia.com/doc/qt-4.8/qmutablelistiterator.html#remove –