277 votes

Pouvez vous supprimer des éléments d’un std::list tout en effectuant une itération à travers elle ?

J’ai un code qui ressemble à ceci :

Je voudrais effacer les éléments inactifs immédiatement après les mettre à jour, afin d’éviter de marcher sur la liste. Mais si j’ajoute les lignes commentées, j’obtiens une erreur lorsque j’arrive à `` : « Itérateur liste pas incrementable ». J’ai essayé quelques suppléants qui n’incrémentent dans la déclaration, mais je ne pouvais pas obtenir quoi que ce soit au travail.

Quelle est la meilleure façon de supprimer des éléments que vous marchez une std::list ?

327voto

Michael Kristofik Points 16035

Vous devez incrémenter l’itérateur d’abord (avec i ++) et puis supprimer l’élément précédent (par exemple, en utilisant la valeur retournée de i ++). Vous pouvez modifier le code pour un certain temps boucle comme suit :

154voto

MSN Points 30386

Vous voulez faire :

Qui met correctement à jour l’itérateur pour pointer vers l’emplacement après l’itérateur, que vous avez supprimé.

28voto

Mike Points 643

Vous devez faire la combinaison de Kristo réponse et de MSN :

Bien sûr, le plus efficace et SuperCool® STL chose savy serait quelque chose comme ceci :

10voto

Mykola Golubyev Points 21210

Utiliser un algorithme de std::remove_if.

Edit : Travail avec les collections devrait être comme : 1. préparer la collection. 2. processus de collection.

La vie sera plus facile si vous ne mélangez pas ces étapes.

  1. std::remove_if. ou list::remove_if (si vous savez que vous travaillez avec liste et pas avec la TCollection)
  2. std::for_each

2voto

Alien01 Points 2503

Enlèvement invalide seulement les itérateurs qui pointent vers des éléments qui sont supprimés.

Alors dans ce cas, après avoir enlevé * j’ai, j’ai est invalidé et vous ne pouvez incrémenter là-dessus.

Ce que vous pouvez faire est d’abord enregistrer l’itérateur d’élément qui doit être supprimé, puis incrémente l’itérateur et puis supprimer la classe enregistrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X