Qt boucle foreach de commande vs pour la boucle pour QList
Lors d'une itération dans un QList<T>
avec un foreach
boucle, dans les tests que j'ai effectué les articles sont retournés dans le même ordre qu'ils sont d'un standard de for
boucle.
Ma question est, sera le foreach
toujours retourner les articles dans l'ordre numérique, de par l'indice de ce genre, pour les conteneurs qui ont ordre naturel (comme QList
et QVector
)? Par exemple, sont les suivants toujours é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";
}
- Vous ne pouvez pas utiliser [i] l'opérateur sur la liste, mais seulement dans le tableau (vecteurs ...) d'avoir un accès aléatoire sur la mémoire. En outre, essayez le c++11 foreac boucle : (pour(T& item : liste) {/*du code */}). Peut-être cela peut vous aider
- Nope,
operator[]
fonctionne très bien. Voir: qt-project.org/doc/qt-4.8/qlist.html#operator-5b-5d - Ok, mais pas dans la STL. Alors, pour ton problème, le plus efficace est d'utiliser des itérateurs à l'aide begin() et end() (j'ai vraiment ne sais pas ce que le foreach macro à faire ...)
Vous devez vous connecter pour publier un commentaire.
La
foreach
macro (aka.Q_FOREACH
) utilise lebegin()
etend()
itérateur méthodes de demande du conteneur.Donc, si votre conteneur est un
QList
ouQVector
ensuite vos exemples sera toujours équivalent. Vous pouvez afficher lesforeach
code source ici.La
foreach
macro n'est pas si grande, il rend une copie du conteneur - utilisez donc seulement sur les conteneurs qui prennent en charge implicite de partage. Utilisation de C++11for( : ) {}
boucles si disponible, sinon Boost a un équivalent qui est de qualité supérieure.Sur la base des informations trouvées ici,
foreach
est beaucoup plus lente que la première, ce qui suggère qu'il n'est pas équivalent.foreach
test a été beaucoup plus lent en raison de la création d'unQString
copie à chaque itération, à l'aide d'un const ref du conteneur réel des données de fait le temps de revenir à peu près la même que les autres tests car ils ont dépassé la copie superficielle. A l'inverse à l'aide d'une liste deints
aurait eu le même effet.