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);
}
ce qui a entraîné un défaut de segmentation. Après avoir examiné le problème, j'ai découvert que le problème réside dans la façon dont la STL gère les itérateurs pour les deques : si l'élément en cours d'effacement est plus proche de la fin du deque, l'itérateur utilisé pour pointer sur l'élément effacé pointera maintenant sur l'élément NEXT, mais pas sur l'élément précédent, car vector::iterator
fait. Je comprends que modifier la condition de la boucle de it != deq.end()
à it < deq.end()
pourrait éventuellement résoudre le problème, mais je me demande s'il existe un moyen de parcourir et d'effacer certains éléments dans un deque dans la "forme standard" afin que le code soit également compatible avec d'autres types de conteneurs.