6

QLinkedListループを使用して反復していforeachますが、特定の条件に一致する場合はアイテムを削除する必要があります。ループを台無しにせずにこれを行う適切な方法は何ですか?

foreach( Object obj, myLinkedList )
{
    if( obj.val == BAD_VAL )
        // remove the item from myLinkedList
}

これに対処する他の質問を見つけましたが、リンクされたリストなどの一般的なケースではありません。

可能であれば、他のデータ構造 ( 、 など)QSetについても知りたいです。QHashありがとう

4

2 に答える 2

19

特定のケースの場合:

ループは実際には元のリストのコピー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
于 2013-07-05T17:29:50.787 に答える