Правило Erase — Remove — загальновживаний в мові програмування C++ метод видалення з контейнера STL елементів, які задовольняють певним критеріям.
Мотивація Досить часто постає потреба видалити з контейнера всі елементи, які мають певне значення або відповідають певному критерію. У мові C++ це можна реалізувати різними методами, зокрема за допомогою самостійно організованого поелементного обходу контейнера. Однак бажано використовувати алгоритми зі стандартної бібліотеки для таких завдань .
Бібліотека algorithm пропонує алгоритми remove або remove_if для цього. Але оскільки ці алгоритми працюють із низкою елементів, обмежених двома заданими ітераторами, вони не можуть знати нічого про внутрішню організацію самого контейнера . Таким чином, ніякі елементи фактично не будуть видалені з контейнера за допомогою лише цих функцій. Після використання однієї з цих функцій всі елементи, що не відповідають критеріям видалення, просто будуть перенесені в передню частину діапазону зі збереженням відносного порядку. Коли це буде зроблено, функція remove або remove_if поверне ітератор, який вказує на елемент наступний за останнім не переміщеним елементом.
Щоб насправді видалити непотрібні елементи з контейнера, використовують поєднання функції remove із викликом функції erase, яка безпосередньо й виконує видалення елементів із контейнера, використовуючи ітератор, який повернула попередньо викликана функція remove. Звідси походить і сама назва методу «Erase — Remove».
Приклад #include <vector> #include <iostream> #include <algorithm>
bool is_odd(int i) { return (i % 2) != 0; }
void print_item(int i) { std::cout << i << ' '; }
void print(const std::vector<int> &vec) { for_each(vec.begin(), vec.end(), print_item); std::cout << std::endl;
int main() { // ініціалізуємо вектор числами 0-9. std::vector<int> v(10); for (unsigned i = 0; i < v.size(); ++i) v[i] = i; print(v);
// видаляємо всі елементи рівні 5 v.erase( std::remove( v.begin(), v.end(), 5 ), v.end() ); print(v);
// видаляємо всі непарні елементи v.erase( std::remove_if( v.begin(), v.end(), is_odd ), v.end() ); print(v);
return 0; }
/* Вивід: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 6 7 8 9 0 2 4 6 8 */
Посилання