J'essaie de supprimer des éléments d'une liste liée C ++ à l'aide de i obtenir cette sortie et ne peut pas sembler Tracer la raison: P> Effacer code> et une liste Itérateur:
added item #0
added item #1
added item #2
added item #3
added item #4
added item #5
added item #6
added item #7
added item #8
added item #9
round #0
round #1
Segmentation fault
4 Réponses :
Le problème de base Voici vous utilisez à la valeur Iterator, Cela ne fait pas non plus mal d'inclure une vérification de comme Tim a souligné, voici une excellente référence pour < code> effacer code> p> IT code>, après avoir appelé
effacer code> dessus. La méthode code> code> invalide l'itérateur et continue de continuer à utiliser des résultats en mauvais comportement. Au lieu de cela, vous souhaitez utiliser le retour de
effacer code> pour obtenir le prochain itérateur valide après la valeur effacée.
newlist.end () code> Pour tenir compte du cas où il n'y a pas au moins 5 éléments dans le
Liste code>. p>
Meilleure réponse que la mienne. Vous ne voulez pas le combiner ++ et effacer, et cela évacue parfaitement cela. Mais j'aime bien partager des liens avec certaines de mes pages de référence préférées: Liste :: Efface < / a>
@Tim, a ajouté la référence à ma réponse. C'est aussi ma page Goto pour les questions C ++ STL.
Lorsque vous effacez un élément en position L'effacement IT code>, l'itérateur
IT code> est invalidé - il pointe un morceau de mémoire que vous venez de libérer. P>
(IT) code> La fonction renvoie un autre itérateur pointant sur l'élément suivant de la liste. Utilisez celui-là! P>
Vous invalidez votre itérateur lorsque vous Vous pourriez également être intéressé par le effacer-supprimer idiom . P> p> ERASE () CODE> Dans la boucle. Il serait plus simple de faire quelque chose comme celui-ci à la place de votre boucle d'effacement:
Je fais cela:
for(list<type>::iterator i = list.begin(); i != list.end(); i++) { if(shouldErase) { i = list.erase(i); i--; } }
Il n'y a pas de problème de saut avec la réponse acceptée: la boucle ne pas incrémenter l'itérateur, IT B>, mais un compteur entier, i b>.
O Ouais, j'ai raté d'être différent lol. stupide t. Modification de ma réponse
Bien que je ne voie pas comment le code dans la réponse fonctionnerait non plus. À moins que je sois à nouveau un idiot, il semble que le code essaierait d'effacer le début de la liste, puis de l'élément suivant et de l'élément suivant jusqu'à ce que j'entiens à 5.
Parce que la question portait sur la suppression des 5 premiers éléments de la liste. Mais de toute façon, en supprimant le i ++ code> de la déclaration de boucle et la mettant comme une clause d'autre serait mieux.
Oui, ce serait mieux je pense. La question posait cependant de fixer la faute SEG, mais non seulement de supprimer les cinq premiers éléments de la liste. Cela vient d'être ce qu'il essayait de faire.