[c++]erreur lors de la suppression

Fermé
jaki1910 Messages postés 3 Date d'inscription vendredi 27 août 2010 Statut Membre Dernière intervention 28 août 2010 - Modifié par jaki1910 le 28/08/2010 à 01:46
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 28 août 2010 à 16:37
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 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 658
Modifié par Pacorabanix le 28/08/2010 à 09:52
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 vendredi 27 août 2010 Statut Membre Dernière intervention 28 août 2010
28 août 2010 à 13:15
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 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 658
Modifié par Pacorabanix le 28/08/2010 à 16:39
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