Функция unique
Функция unique удаляет подряд идущие
одинаковые элементы из диапазона. Важно понимать,
что функция не изменяет размер контейнера, а лишь
перемещает уникальные элементы в начало диапазона
и возвращает итератор на новый логический конец
последовательности. В первый и второй параметры
мы передаем итераторы начала и конца диапазона,
а в необязательный третий параметр - предикат,
который определяет, считать ли два элемента
одинаковыми.
Синтаксис
unique(first, last)
unique(first, last, pred)
Пример
Давайте удалим подряд идущие одинаковые числа из вектора:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {1, 1, 2, 2, 2, 3, 4, 4, 5};
auto last = unique(v.begin(), v.end());
v.erase(last, v.end());
for (int el : v) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Пример
Важно помнить, что unique удаляет
только подряд идущие одинаковые элементы.
Давайте рассмотрим пример, где одинаковые
числа стоят не рядом:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {1, 2, 1, 2, 1};
auto last = unique(v.begin(), v.end());
v.erase(last, v.end());
for (int el : v) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 1 2 1
Пример
Давайте используем предикат для удаления
подряд идущих элементов, которые отличаются
не более чем на 1:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {1, 2, 4, 5, 8, 9, 10};
auto last = unique(v.begin(), v.end(), [](int a, int b) {
return abs(a - b) <= 1;
});
v.erase(last, v.end());
for (int el : v) {
cout << el << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 4 8