J'ai récemment appris la bonne façon de travailler avec les itérateurs inversés en C++ (en particulier lorsque vous devez en effacer un). (Voir this question et this one.)Utiliser un itérateur régulier pour reculer, ou lutter avec reverse_iterator?
Voici comment vous êtes censé le faire:
typedef std::vector<int> IV;
for (IV::reverse_iterator rit = iv.rbegin(), rend = iv.rend();
rit != rend; ++rit)
{
// Use 'rit' if a reverse_iterator is good enough, e.g.,
*rit += 10;
// Use (rit + 1).base() if you need a regular iterator e.g.,
iv.erase((rit + 1).base());
}
Mais je pense que
pensais que c'est beaucoup mieux (Ne le faites pas, pas aux normes compatibles, comme le souligne MooingDuck):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin;)
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it);
}
Cons:
-
Vous me dites. Qu'est-ce qui ne va pas? - Ce n'est pas conforme aux normes, comme le souligne MooingDuck. Cela annule à peu près tous les avantages possibles ci-dessous.
Plus:
- Utilise un langage familier pour la marche arrière pour boucles
- Ne pas à se rappeler (ou expliquer) le
+1
- Moins tapant
- Works pour std: : liste aussi:
it = il.erase(it);
- Si vous effacez un élément, vous n'avez pas besoin d'ajuster l'itérateur
- Si vous supprimez, vous ne devez pas recalculer le début iterator
Vous voulez dire en plus du fait que c'est un comportement indéterminé et qu'il échouera/tombera en panne dans des situations courantes? Essayez-le avec une «carte» vide. –
soin d'élaborer dans une réponse? Est-ce que l'UB décrémente un itérateur d'entrée ou décrémente après le début? Est-ce UB pour tous les conteneurs? – Dan
Impossible de décrémenter un itérateur d'entrée ou de sortie (j'ai oublié celui-là, bon oeil), et vous ne pouvez pas non plus diminuer le début d'un conteneur. –