J'ai une situation où je marche par un vecteur, de faire les choses:Quel est le moyen le plus propre de marcher et de désenvoyer un vecteur std :: en utilisant des itérateurs?
std::vector::iterator iter = my_list.begin(); for (; iter != my_list.end(); ++iter) { if (iter->doStuff()) // returns true if successful, false o/w { // Keep going... } else { for (; iter != m_list.begin(); --iter) // ...This won't work... { iter->undoStuff(); } } }
Dans des conditions normales - en supposant que tout se passe bien - je marche tout le chemin à my_list.end()
et terminer la boucle avec succès.
Cependant, si quelque chose ne va pas pendant que je fais des choses, je veux pouvoir tout annuler - revenez essentiellement au tout début du vecteur, en défaisant tout un à la fois dans l'ordre inverse.
Mon problème est que lorsque j'arrive à my_list.begin()
- comme le montre la boucle for imbriquée - je n'ai vraiment pas encore terminé car j'ai encore besoin d'appeler undoStuff()
sur mon premier élément de la liste. Maintenant, je pourrais juste faire l'appel final en dehors de la boucle, mais cela semble un peu sale.
La façon dont je le vois, je n'ai terminé que lorsque j'arrive à my_list.rend()
. Cependant, je ne peux pas comparer un std :: vector :: iterator à un std :: vector :: reverse_iterator. Étant donné ce que j'essaie de faire, quel est le meilleur choix de combinaison de type itérateur/boucle?
Une manière simple de penser aux itérateurs est qu'ils sont des curseurs aux positions entre les éléments. Un itérateur avant produira l'élément après le curseur lorsqu'il sera déréférencé, un itérateur inverse produira l'élément avant le curseur lorsqu'il sera déréférencé. Les itérateurs avant et arrière équivalents sont des curseurs qui sont à la même position. – Mankarse