Edit: la documentation de std::remove
a été corrigée depuis la rédaction de cette réponse. La même chose s'applique à list::remove
.
Permettez-moi de vous donner un exemple pour vous montrer comment cpluscplus.com peut se tromper.
Considérez la std::remove
fonction de <algorithm>
.
Le fait est que std::remove
cela ne supprime pas l'article du conteneur. C'est parce que ne std::remove
fonctionne qu'avec une paire d'itérateurs et ne sait rien du conteneur qui contient réellement les éléments. En fait, il n'est pas possible std::remove
de connaître le conteneur sous-jacent, car il est impossible de passer d'une paire d'itérateurs pour découvrir le conteneur auquel les itérateurs appartiennent. Il std::remove
ne supprime donc pas vraiment les éléments, simplement parce qu'il ne le peut pas . La seule façon de supprimer réellement un élément d'un conteneur est d'appeler une fonction membre sur ce conteneur.
Donc, si vous souhaitez supprimer les éléments, utilisez alors Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Mais cplusplus.com
donne des informations incorrectes sur std::remove
. Ça dit
Notez que cette fonction ne modifie pas les éléments au-delà de la nouvelle fin, qui conservent leurs anciennes valeurs et sont toujours accessibles .
ce qui n'est pas correct. L'itérateur de la plage [new_end, old_end)
est toujours déréférençable, mais cela ne signifie PAS qu'ils conservent les anciennes valeurs et sont toujours accessibles. Ils ne sont pas spécifiés.
De même, cplusplus.com
donne également des informations incorrectes sur list::remove
. Ça dit ,
Notez qu'une fonction d'algorithme global, remove, existe avec un comportement similaire mais fonctionnant entre deux itérateurs.
ce qui est complètement faux. La suppression globale à savoir std::remove
n'est pas similaire à list::remove
, car nous avons vu que la première ne supprime PAS vraiment les éléments du conteneur car elle ne le peut pas , tandis que la seconde (la fonction membre) supprime vraiment les éléments parce qu'elle le peut .
Cette réponse est copiée de ma autre réponse dans le sujet suivant, avec peu de modifications:
Remarque: Depuis que je suis tombé sur ce sujet récemment alors que je répondais dans le sujet ci-dessus, je m'en souviens. Il y a beaucoup d'erreurs que j'ai rencontrées au cours des deux dernières années, dont je ne me souviens pas. Je pourrais en ajouter quelques autres plus tard, si je reviens.