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)
// ...