特定のケースの場合:
ループは実際には元のリストのコピーforeach
に対して機能しているため、リストを変更するためにループを使用するべきではないようです。それを変更すると、暗黙の共有と書き込み時の変更のためにペナルティが発生するだけでなく、ループを終了すると変更も破棄されます。foreach
これを実現する正しい方法は、反復子を使用することです。私は Java スタイルの反復子を好みます。各リスト タイプには、単純なイテレータを提供するイテレータ クラスがあることに気付くでしょう。QLinkedList
例として、クラスがありますQMutableLinkedListIterator
。次のように使用できます。
私のコメントが追加されたQtのドキュメントから:
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
}
}
一般的な場合:
以外の Qt データ構造を使用している場合はQLinkedList
、イテレータ クラスがある可能性が高くなります。リストを変更する場合は、Mutable バージョンを使用してください。API は、これらのそれぞれでほぼ同じです。クラスは次のとおりです。
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