Изменить: документация для std::remove
была исправлена с момента написания этого ответа. То же самое относится и к list::remove
.
Позвольте привести вам пример того, как cpluscplus.com может ошибиться.
Рассмотрим std::remove
функцию от <algorithm>
.
Дело в том, что std::remove
не удаляет элемент из контейнера. Это потому, что std::remove
работает только с парой итераторов и ничего не знает о контейнере, который фактически содержит элементы. На самом деле, невозможно std::remove
узнать базовый контейнер, потому что он не может пройти путь от пары итераторов, чтобы узнать о контейнере, к которому принадлежат итераторы. Так std::remove
что на самом деле не удаляет предметы, просто потому что не может . Единственный способ действительно удалить элемент из контейнера - это вызвать функцию-член этого контейнера.
Так что, если вы хотите удалить элементы, тогда используйте Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Но cplusplus.com
дает неверную информацию о std::remove
. Это говорит
Обратите внимание, что эта функция не изменяет элементы после нового конца, которые сохраняют свои старые значения и по- прежнему доступны .
что не правильно. Итератор в диапазоне [new_end, old_end)
все еще разыменовывается, но это НЕ означает, что они сохраняют старые значения и по-прежнему доступны. Они не указаны.
Точно так же cplusplus.com
дает неверную информацию о себе list::remove
. Это говорит ,
Обратите внимание, что глобальная функция алгоритма, remove, существует с похожим поведением, но работает между двумя итераторами.
что совершенно неправильно. Глобальное удаление, а именно std::remove
, не похоже на то list::remove
, как мы видели, что первое НЕ действительно удаляет элементы из контейнера, потому что это не может , тогда как второе (функция-член) действительно удаляет элементы, потому что оно может .
Этот ответ скопирован из моего другого ответа в следующей теме, с небольшими изменениями:
Примечание: так как я столкнулся с этим недавно, когда отвечал в вышеупомянутой теме, я помню это. За последние два года я столкнулся с множеством ошибок, которые не помню. Я мог бы добавить еще несколько позже, если я столкнусь снова.