C++ itérateurs & optimisation en boucle

Je vois beaucoup de code c++ qui ressemble à ceci:

for( const_iterator it = list.begin(),
     const_iterator ite = list.end();
     it != ite; ++it)

Contrairement à la version la plus concise:

for( const_iterator it = list.begin();
     it != list.end(); ++it)

Il n'y aura aucune différence de vitesse entre ces deux conventions? Naïvement le premier sera un peu plus rapide depuis la liste.fin() n'est appelée qu'une seule fois. Mais depuis l'itérateur est const, il semble que le compilateur va tirer de ce test de la boucle, de générer l'équivalent de l'assemblée pour les deux.

  • La déclaration de " ite " serait une erreur de syntaxe si votre première version est "pour (const_iterator i = liste.begin(), e = liste.end(); i != e; ++i)". Ce n'est qu'un peu plus de caractères que la deuxième forme, donc je viens de l'utiliser par défaut.
  • Maintenant en C++11, il est également for(auto it : list) qui est essentiellement le second. Mais c'est beaucoup plus agréable.
  • gamme pour les boucles d'éléments, pas itérateur positions, donc l'équivalent est for ( const auto& element : list )
  • si vous voulez être technique, ce n'est pas le même, parce que les ni sont des itérateurs. Essayez d'accéder à element->whatever
  • hmm? Je pense que c'est le même point, j'ai été ce qui implique que la variable de boucle est un élément, par conséquent doit utiliser element.whatever. Droit?
  • Je l'ai ajouté dans pas parce que c'est exactement baisse de remplacement, mais parce que c'est un moyen d'obtenir la même fonctionnalité/résultat final simplement et facilement.
  • la gamme de boucle est équivalent à la première forme, pas le second formulaire (en.cppreference.com/w/cpp/language/range-for)
  • mais const_iterator signifie seulement "vous ne pouvez pas modifier le conteneur par le biais de cet itérateur", pas " rien d'autre ne peut modifier le conteneur à l'intérieur de cette boucle.

InformationsquelleAutor Quantum7 | 2009-04-28