Le meilleur/la plus simple façon d'inverser itérer une liste (comme déjà dit) à utiliser reverse itérateurs rbegin/rend.
Cependant, je tiens à préciser que d'inverser les itérateurs sont mis en œuvre de stocker le "courant" iterator position de hors-en-un (au moins sur l'implémentation GNU de la bibliothèque standard).
Ceci est fait pour simplifier la mise en œuvre, dans l'ordre de la plage dans le sens inverse à la même sémantique que d'une gamme de l'avant [début, fin) et [rbegin, rené)
Ce que cela signifie, c'est que le déréférencement d'un itérateur, implique la création d'un nouveau temporaire, puis le décrémenter, à chaque fois:
reference
operator*() const
{
_Iterator __tmp = current;
return *--__tmp;
}
Ainsi, *référence à un reverse_iterator est plus lent que la normale itérateur.*
Toutefois, Vous pouvez à la place utiliser le itérateurs bidirectionnels pour simuler l'inverse de l'itération de vous-même, évitant ce traitement:
for ( iterator current = end() ; current != begin() ; /* Do nothing */ )
{
--current; // Unfortunately, you now need this here
/* Do work */
cout << *current << endl;
}
Des essais ont montré que cette solution soit ~5 fois plus rapide pour chaque déréférencement utilisés dans le corps de la boucle.
Remarque: ce Test n'a pas été fait avec le code ci-dessus, en tant que std::cout aurait été le goulot d'étranglement.
À Noter également: le "mur de l'horloge temps" la différence était d'environ 5 secondes avec un std::la taille de la liste des 10 millions d'éléments. Donc, de façon réaliste, à moins que la taille de vos données est très grande, il suffit de coller à rbegin() rend()!