web-dev-qa-db-fra.com

Ordre des boucles Qt foreach vs boucle for for QList

Lors de l'itération à travers un QList<T> avec une boucle foreach, dans les tests que j'ai effectués, les éléments sont retournés dans le même ordre qu'ils le sont avec une boucle standard for.

Ma question est la suivante: le foreach renverra-t-il toujours les éléments par ordre numérique par index comme celui-ci, pour les conteneurs qui ont un ordre naturel (comme QList et QVector)? Par exemple, les éléments suivants toujours sont-ils équivalents?

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

La macro foreach (aka. Q_FOREACH) Utilise les méthodes de demande d'itérateur begin() et end() du conteneur.

Donc, si votre conteneur est un QList ou QVector, vos exemples seront toujours équivalents. Vous pouvez afficher le code source foreachici .

La macro foreach n'est pas géniale cependant, elle fait une copie du conteneur - donc utilisez-la uniquement sur les conteneurs qui prennent en charge le partage implicite. Utilisez les boucles C++ 11 for( : ) {} si elles sont disponibles, sinon Boost a un équivalent supérieur.

32
cmannett85

D'après les informations trouvées ici , foreach est beaucoup plus lent que le premier, ce qui suggère qu'il n'est pas équivalent.

4
Krozark