Редагувати: Документація на std::remove
виправлена з моменту написання цієї відповіді. Те ж саме стосується і list::remove
.
Дозвольте навести приклад, щоб показати вам, як cpluscplus.com може помилитися.
Розглянемо std::remove
функцію від <algorithm>
.
Справа в тому, що std::remove
він не видаляє предмет з контейнера. Це тому, що std::remove
працює лише з парою ітераторів і нічого не знає про контейнер, який фактично містить елементи. Насправді std::remove
знати базовий контейнер неможливо , оскільки немає можливості перейти від пари ітераторів, щоб дізнатися про контейнер, до якого належать ітератори. Тож std::remove
насправді не видаляйте елементи просто тому, що вони не можуть . Єдиний спосіб фактично видалити елемент з контейнера - це викликати функцію члена на цьому контейнері.
Тож якщо ви хочете видалити елементи, тоді використовуйте Стерти-видалити ідіому :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Але cplusplus.com
дає неправильну інформацію про std::remove
. Він говорить
Зауважте, що ця функція не змінює елементи минулого нового кінця, які зберігають свої старі значення та все ще доступні .
що невірно. Ітератор у діапазоні [new_end, old_end)
все ще зберігається, але це НЕ означає, що вони зберігають старі значення та все ще доступні. Вони не визначені.
Аналогічно cplusplus.com
дає і невірну інформацію про list::remove
. Це говорить ,
Зауважте, що функція видалення глобального алгоритму існує з подібною поведінкою, але працює між двома ітераторами.
що абсолютно неправильно. Глобальне видалення std::remove
- це не схоже на те list::remove
, як ми побачили, що перший НЕ дійсно видаляє елементи з контейнера, оскільки не може , тоді як другий (функція-член) дійсно видаляє елементи, оскільки може .
Ця відповідь скопійована з моєї іншої відповіді в наступній темі, з незначними змінами:
Примітка: Оскільки я нещодавно натрапив на це, коли відповідав у вищевказаній темі, я пам’ятаю це. Є багато помилок, з якими я стикався протягом останніх двох років, яких я не пам’ятаю. Я можу додати ще декілька пізніше, якщо я знову зустрінусь.