Edycja: Dokumentacja dla std::remove
została naprawiona od czasu napisania tej odpowiedzi. To samo dotyczy list::remove
.
Pozwól, że podam przykład pokazujący, jak cpluscplus.com może to zrobić źle.
Rozważ std::remove
funkcję od <algorithm>
.
Faktem jest, że std::remove
nie usuwa przedmiotu z pojemnika. Jest tak, ponieważ std::remove
działa tylko z parą iteratorów i nie wie nic o kontenerze, który faktycznie zawiera elementy. W rzeczywistości nie jest możliwe std::remove
poznanie podstawowego kontenera, ponieważ nie ma możliwości, aby para iteratorów odkryła kontener, do którego należą iteratory. Więc std::remove
tak naprawdę nie usuwa przedmiotów, po prostu dlatego, że nie może . Jedynym sposobem na faktyczne usunięcie elementu z kontenera jest wywołanie funkcji członka na tym kontenerze.
Więc jeśli chcesz usunąć elementy, użyj Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Ale cplusplus.com
podaje nieprawidłowe informacje na temat std::remove
. To mówi
Zauważ, że ta funkcja nie zmienia elementów za nowym końcem, które zachowują swoje stare wartości i są nadal dostępne .
co nie jest poprawne. Iterator w zakresie [new_end, old_end)
jest nadal dereferencyjny, ale to wcale nie znaczy, że zachowują stare wartości i są nadal dostępne. Są nieokreślone.
Podobnie cplusplus.com
podaje również nieprawidłowe informacje na temat list::remove
. Mówi :
Zauważ, że globalna funkcja algorytmu, remove, istnieje z podobnym zachowaniem, ale działa między dwoma iteratorami.
co jest całkowicie błędne. Globalne usunięcie mianowicie std::remove
nie jest podobne list::remove
, jak widzieliśmy, że ten pierwszy NIE usuwa rzeczy z kontenera, ponieważ nie może , podczas gdy drugi (funkcja członka) naprawdę usuwa elementy, ponieważ może .
Ta odpowiedź została skopiowana z mojej innej odpowiedzi w następującym temacie, z niewielkimi modyfikacjami:
Uwaga: odkąd ostatnio na to natrafiłem, odpowiadając na powyższy temat, pamiętam to. W ciągu ostatnich dwóch lat napotkałem wiele błędów, których nie pamiętam. Mogę dodać kilka później, jeśli znów się spotkam.