Lors de l'itération sur des éléments d'un vecteur, il est préférable d'utiliser des itérateurs au lieu d'un index (voir Why use iterators instead of array indices?).Obtention d'un index dans un vecteur en utilisant des itérateurs
std::vector<T> vec;
std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
// do work
}
Cependant, il peut être nécessaire d'utiliser l'index dans le corps de la boucle. Lequel des éléments suivants serait préférable dans ce cas, compte tenu de la performance et de la flexibilité/extensibilité?
- Revert à la boucle indexée
std::vector vec; size_t i; for (i = 0; i < vec.size(); ++i) { // use i }
- Calculer décalage
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = it - vec.begin(); // use i }
- Utilisez std :: Distance
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = std::distance(vec.begin(), it); // use i }
Oublié mentionner la performance, généralement il est sûr de supposer que la boucle indexée aurait de meilleures performances, mais les performances seraient très similaires dans les deux cas. – Guvante
Je ne peux pas dire que je suis d'accord. Le corps de la boucle peut contenir d'autres codes qui déréférencent l'itérateur. Les itérateurs ne sont pas destinés à rendre votre code plus simple, ils rendent votre code plus générique. En utilisant les itérateurs, vous pouvez échanger le vecteur contre une liste et cela fonctionnera toujours. – QBziZ
De plus, les itérateurs std :: map ou std :: set sont loin d'être stupides. Si je bouclais toutes les clés possibles, cela prendrait probablement une éternité. De plus, je devrais faire une recherche O (log (n)) sur chaque touche. Donc, ma boucle prendrait O (m * log (n)). En utilisant un itérateur, je pourrais boucler la collection en temps O (n). –