30 votes

Vecteur des itérateurs < ou !=

Quelqu'un pourrait-il m'aider à comprendre s'il y a une grande différence en != et < quand il s'agit de parler de vecteur itérateurs dans un for boucle?

Je veux dire, peu importe si vous utilisez != et <, le résultat devrait être le même?

for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++)
    // DO STUFF
for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++)
    // DO STUFF

Je suis conscient que la façon la plus commune est d'utiliser !=, mais serait - < être un gros problème si on l'utilise?

42voto

Maxim Yegorushkin Points 29380

operator< est uniquement pris en charge pour des itérateurs à accès aléatoire. std::vector::iterator est un itérateur à accès aléatoire, de sorte que les deux i != vec.end() et i < vec.end() sont pris en charge et valide et ne font aucune différence dans votre exemple.

Si vous aviez un conteneur qui ne prend pas en charge des itérateurs à accès aléatoire (par exemple, std::list), i < list.end() ne serait pas compiler.

La recommandation générale est d'utiliser postfix incrément uniquement lorsque c'est nécessaire, car il peut créer une copie superflue lorsque l'itérateur est non-trivial, alors ++i est propre et peut être plus rapide.

Aussi, si la boucle s'appelle une fonction dont la définition n'est pas disponible dans cette unité de traduction, vec.end() va être rechargé à partir de la mémoire à chaque itération de boucle, ce qui pourrait provoquer inutilement un cache miss. Vous pouvez éviter que les recharger en économie de la valeur dans une variable locale, de sorte que le compilateur est certain que la variable locale est inaccessible à toute autre fonction:

for(vector<int>::iterator i = vec.begin(), j = vec.end(); i < j; ++i)
    // ...

Mieux encore, vous pouvez, comme pour l'utilisation de la gamme de boucles d'éviter ces pièges pour vous:

for(auto const& elem : vec)
    // ...

10voto

Galik Points 522

L'ensemble de la philosophie de l' STL de la partie de la Bibliothèque Standard (les conteneurs, les itérateurs et les algorithmes) est de minimiser le programatic distinctions entre les conteneurs. Ils présentent des propriétés différentes mais comment vous le programme est conçu pour être aussi semblables que possible.

Cela les rend plus facile à apprendre et facile à utiliser de façon générique. Cela signifie que vous pouvez écrire un générique de la fonction (ou algorithme) et de le faire appliquer à tout autre type de contenant (ou autant que possible).

Avec cela à l'esprit, il est avantageux d'utiliser une syntaxe qui est commun à tous les conteneurs et les itérateurs , si possible.

Seuls certains conteneurs de itérateurs permettent < des comparaisons, mais tous les conteneurs de itérateurs accepte !=. Pour cette raison, je recommande toujours à l'aide de != comme une question de cohérence et afin de faciliter votre code d'être facilement transférées vers un autre conteneur.

9voto

Demosthenes Points 1404

Il y a une différence, mais pas pour std::vector. Tous les itérateurs sont l'égalité comparable, donc, != le sera toujours. Seulement accès aléatoire itérateurs sont moins comparables, qu'est - std::vector, donc dans votre cas, il ne serait pas un gros problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X