Функция remove_if
Функция remove_if удаляет из диапазона
все элементы, для которых предикат возвращает
true. Функция принимает два итератора,
задающих диапазон, и третий параметр -
унарный предикат, который проверяет каждый
элемент. Функция возвращает новый конец
диапазона. Важно понимать, что функция не
меняет размер контейнера, а лишь перемещает
«ненужные» элементы в конец и возвращает
итератор на первый из них. Для фактического
удаления элементов обычно используют метод
erase контейнера.
Синтаксис
remove_if(first, last, pred)
Пример
Давайте удалим из вектора все чётные числа.
Для этого передадим в предикат лямбда-функцию,
которая проверяет, делится ли число на 2
без остатка:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {1, 2, 3, 4, 5};
auto new_end = remove_if(v.begin(), v.end(),
[](int x) { return x % 2 == 0; });
v.erase(new_end, v.end());
for (int x : v)
{
cout << x << " ";
}
return 0;
}
Результат выполнения кода:
1 3 5
Пример
Давайте посмотрим, что произойдёт, если не
вызывать метод erase. Функция
remove_if лишь возвращает итератор
на новый логический конец, но физический
размер вектора остаётся прежним:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {1, 2, 3, 4, 5};
auto new_end = remove_if(v.begin(), v.end(),
[](int x) { return x > 3; });
cout << "Size: " << v.size() << endl;
for (int x : v)
{
cout << x << " ";
}
return 0;
}
Результат выполнения кода:
"Size: 5"
1 2 3 4 5
Пример
Давайте удалим из вектора строк все строки,
длина которых меньше 2:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
vector<string> v = {"a", "ab", "abc", "d", "de"};
auto new_end = remove_if(v.begin(), v.end(),
[](const string& s) { return s.length() < 2; });
v.erase(new_end, v.end());
for (const string& s : v)
{
cout << s << " ";
}
return 0;
}
Результат выполнения кода:
"ab" "abc" "de"
Смотрите также
-
функция
remove,
которая удаляет элементы по значению -
функция
copy_if,
которая копирует элементы по условию -
функция
replace_if,
которая заменяет элементы по условию -
функция
unique,
которая удаляет соседние дубликаты