En utilisant std::deque::iterator (en C++ STL) pour la recherche et la suppression de certains éléments

J'ai rencontré un problème en invoquant le code suivant:

#include<deque>
using namespace std;

deque<int> deq = {0,1,2,3,4,5,6,7,8};

for(auto it = deq.begin(); it != deq.end(); it++){
    if(*it%2 == 0)
        deq.erase(it);
}

qui a entraîné une erreur de segmentation. Lorsque l'on regarde le problème que j'ai constaté que le problème réside dans la façon dont la STL gère les itérateurs pour deques: si l'élément en cours d'effacement est plus proche de la fin de la deque, l'itérateur utilisé pour pointer vers l'élément effacé maintenant pointer vers l'élément SUIVANT, mais pas l'élément précédent, comme vector::iterator. Je comprends que la modification de la condition de la boucle de it != deq.end() à it < deq.end() pourrait peut-être résoudre le problème, mais je me demande juste si il y a un chemin à parcourir & effacer un élément dans un deque dans le "formulaire standard" alors que le code peut être compatible avec d'autres types de conteneurs.

Utilisation std::remove_if.
Vous pouvez effectuer les opérations à l'intérieur de la fonction (ou la fonction de l'objet) attribué à std::remove_if, alors vous pouvez toujours utiliser std::remove_if(comme @Fraser a suggéré). Je vous suggère d'utiliser les algorithmes génériques à la place de la plaine de la boucle, parce que la boucle n'est pas assez clair avec vos intentions. Aussi, je pense que la modification et la traversant le récipient en même temps c'est dangereux.

OriginalL'auteur William Huang | 2013-03-19