Per il caso specifico:
Apparentemente foreach
loop non devono essere utilizzati per modificare l'elenco a tutti, perché il ciclo foreach
sta attualmente lavorando su una copia della lista originale. Se lo modifichi, non solo subisci una penalità a causa della condivisione implicita e modifica-on-write, ma le tue modifiche vengono scartate anche una volta che esci dal ciclo.
Il modo corretto per eseguire ciò è utilizzare un iteratore. Preferisco gli iteratori in stile Java. Noterai che esistono classi di iteratore per ogni tipo di elenco che forniscono iteratori semplici. Per l'esempio QLinkedList
, esiste una classe QMutableLinkedListIterator
. Può essere utilizzato come segue:
Dal Qt documentation con i miei commenti aggiunti:
QMutableLinkedListIterator<int> i(list); // pass list as argument
while (i.hasNext()) {
int val = i.next(); // retrieve value of current item
if (val < 0) {
i.setValue(-val); // change/set value of current item
} else if (val == 0) {
i.remove(); // delete current item
}
}
Per il caso generale:
Se si utilizza una struttura dati diversa da Qt QLinkedList
, è probabile che esista una classe iteratore per te. Se si desidera modificare l'elenco, utilizzare la versione Mutevole. L'API è più o meno la stessa per ognuno di questi. Ecco le classi:
Structure | Immutable Case | Mutable Case
-----------------------------------------------------
QList | QListIterator | QMutableListIterator
QLinkedList | QLinkedListIterator | QMutableLinkedListIterator
QHash | QHashIterator | QMutableHashIterator
QMap | QMapIterator | QMutableMapIterator
QSet | QSetIterator | QMutableSetIterator
QStringList | QStringListIterator | QMutableStringListIterator
QVector | QVectorIterator | QMutableVectorIterator
fonte
2013-07-05 17:29:50
@hyde Ho collegato a quella stessa domanda nella mia domanda, affermando che non ha affrontato la totalità di ciò che stavo chiedendo. C'è una differenza tra 'QList' e' QLinkedList'. Sono simili, ma * non * identici. –
Bene, risponde alla domanda, per quanto posso vedere. Qt prende una copia superficiale del contenitore quando si usa il suo 'foreach'. Se si modifica la struttura dei contenitori originale, Qt deve creare una nuova copia profonda (copia sulla semantica di scrittura) del contenitore completo. In breve, non usare 'foreach' per questo. E la semantica è la stessa per ogni contenitore Qt. – hyde