[c++]erreur lors de la suppression

jaki1910 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

comment je peux supprimer sans avoir d'erreurs !!!!!
j'ai écris ce code mais j'ai un erreur lors de la suppression je ne vois pas l'erreur que j'ai commis merci de me répondre.

for(list<Etudiant>::iterator it=liste.begin();it!=liste.end();it++){ 
  if((it->getsexe()=='f')||(it->getsexe()=='F')){ 

   tab[j].setNom(it->getNom()); 
    
   liste.erase(it); 
   j++; 
  } 
}


dans ce code j'essai de transférer les données d'une liste vers un tableau, après transfert, je supprime l'élément transférer.

3 réponses

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
tu dis que tu as une erreur, mais tu ne dis pas laquelle... y'a t-il un message d'erreur à la compilation ? à l'exécution ? un comportement étrange ? Dans ce dernier cas, quel comportement ?
0
jaki1910 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour votre réponse, j'ai l'erreur suivant:

Debug Assertion Failed
...
Expression:List iterator not incrementable.

si je désactive la ligne de liste.erase(it) le programme fonction bien mais je n'arrive pas à supprimer de la liste.
Merci.
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
le problème c'est qu'une fois que tu supprimes "it" avec erase(it), it devient un itérateur non valide (puisqu'il ne pointe plus sur aucun élément de la liste).
Donc ensuite lorsque la deuxième passe de la boucle essaye de faire "it++" ça donne l'erreur que tu vois.

la fonction erase() renvoie l'itérateur sur l'élément suivant. Tu devrais essayer de remplacer ton code :

for(list<Etudiant>::iterator it=liste.begin();it!=liste.end();it++){       
  if((it->getsexe()=='f')||(it->getsexe()=='F')){       

   tab[j].setNom(it->getNom());       
          
   liste.erase(it);       
   j++;       
  }       
}


par ceci :

list<Etudiant>::iterator it=liste.begin();      
while(it!=liste.end()){       
   if((it->getsexe()=='f')||(it->getsexe()=='F')){       
      tab[j].setNom(it->getNom());       
      //on supprime l'itérateur et on récupère d'un coup l'élément suivant    
      it=liste.erase(it);     
      j++;       
   }      
   else {      
      //si on n'a rien effacé il faut avancer dans la liste      
      ++it;      
   }       
}


j'espère ne pas avoir écrit trop de bêtises...
0