it-swarm.com.de

Qt foreach-Schleifenreihenfolge vs. for-Schleife für QList

Beim Durchlaufen eines QList<T> mit einer foreach Schleife, in den Tests, die ich durchgeführt habe, werden die Elemente in der gleichen Reihenfolge zurückgegeben wie mit einer Standardschleife for.

Meine Frage ist, wird das foreach für Container mit natürlicher Reihenfolge (wie QList und QVector) immer Elemente in numerischer Reihenfolge nach Index wie folgt zurückgeben? Sind zum Beispiel die folgenden immer äquivalent?

QList<T> list;

for( int i=0; i<list.count(); ++i )
{ 
    // process items in numerical order by index
    // do something with "list[i]";
}

foreach( T item, list )
{ 
    // will items always be processed in numerical order by index?
    // do something with "item";
}
22
Freedom_Ben

Das Makro foreach (aka. Q_FOREACH) Verwendet die Iteratoranforderungsmethoden begin() und end() des Containers.

Wenn Ihr Container also ein QList oder QVector ist, sind Ihre Beispiele immer gleichwertig. Sie können den foreach Quellcode anzeigen hier .

Das Makro foreach ist jedoch nicht besonders gut, es erstellt eine Kopie des Containers. Verwenden Sie es daher nur für Container, die implizites Teilen unterstützen. Verwenden Sie C++ 11 for( : ) {} - Schleifen, falls verfügbar, andernfalls verfügt Boost über ein überlegenes Äquivalent.

32
cmannett85

Basierend auf den gefundenen Informationen hier ist foreach viel langsamer als das erste, was darauf hindeutet, dass es nicht äquivalent ist.

4
Krozark