9
votes

Quel est le comportement de l'effacement de la fin () `of a` std :: liste`?

J'ai besoin de supprimer un élément d'un std :: Liste Après le trouver avec std :: Trouver . Quel est le comportement de l'appelant std :: liste :: efface avec le fin () de la liste? Mon cas est quelque chose comme ceci: xxx

Cplusplus.com dit:

Si la position (ou la plage) est valide , la fonction ne jette jamais des exceptions (garantie sans jeton). Sinon, cela provoque un comportement indéfini.

mais ce que je ne sais pas, c'est si fin () est considéré comme valide là-bas.


6 commentaires

fin () est un dernier élément.


Cplusplus.com est également en dehors des limites des sources réputées. Voir cpprefreence.com à la place.


@Potatoswatter: Internet est en dehors des limites des sources réputées. Voir la spécification de la langue à la place.


@Mikeeseymour hmm, si nous sommes dans une maison de verre ... Quoi qu'il en soit, le site wiki est assez bien entretenu par les utilisateurs intéressés, la même foule que sur ce site. Cplusplus.com De l'autre côté est fermé. Ils se concentrent sur le référencement pour obtenir des liens de Google, au détriment de la précision.


@Potatoswatter: En outre, CPPreference.com ne mentionne pas de conditions préalables Sur les arguments à Effacer du tout, ne vous aide pas avec cette question.


C'est vrai, Mike. J'ai vérifié cpprefreence.com et cela ne dit rien sur ce que les itérateurs sont acceptés comme des arguments.


3 Réponses :


6
votes

Ce n'est pas le cas. Essayer d'effacer fin () entraîne un comportement non défini.


0 commentaires

2
votes

extrémité () renvoie un itérateur faisant référence à l'itérateur de la liste passée dans le conteneur de liste et non le dernier objet de la liste.

En supprimant / Effacement fin, vous supprimez en dehors de la plage de votre liste. Votre code doit être: xxx

aussi si la recherche () ne trouve pas une valeur dans votre liste, il retournera l'itérateur final, il vous dit essentiellement que la valeur que vous êtes. La recherche est en dehors de votre liste (pas sur votre liste)


2 commentaires

Il n'y a pas d'élément de bout passé dans un conteneur. fin () retourne un passé-the-end itérateur . En général, un itérateur d'un passé à l'autre n'a pas à se référer à un élément, bien que dans de nombreuses situations, cela fait en fait.


Fou? J'espère que je n'ai pas rencontré de cette façon.



19
votes

Ce site utilise le terme vague (et sans doute incorrect) "valide", mais la spécification de la bibliothèque (C ++ 11 23.2.3) utilise le terme plus spécifique "latérérance" - ce qui signifie que l'itérateur doit se référer à un objet. L'itérateur du passé à l'extrémité n'est pas déérogé, alors l'effaçage qu'il donne un comportement indéfini.


4 commentaires

+1, aussi je pense que le Web a un problème pire que d'être vague , comme étant valide est un terme utilisé dans la norme et fin () < / code> donne un achabillé itérateur (c'est-à-dire que la page Web n'est pas vague , il est mauvais )


En réalité, la spécification de la bibliothèque utilise également "valide" (par exemple, pour l'insertion, où un extrémité () -iterator est ok), mais il dit explicitement "valide et inerférencable" comme une exigence d'erase mono-itérateur.


Merci! C'est ce que je cherchais. Je n'ai pas accès à la spécification. Savez-vous si c'est la même chose en C ++ 03?


@Janoma: Oui, c'est la même chose en C ++ 03.