std::list<T,Allocator>::unique
void unique(); | (1) | (до C++20) |
size_type unique(); | (начиная с C++20) | |
template< class BinaryPredicate > void unique( BinaryPredicate p ); | (2) | (до C++20) |
template< class BinaryPredicate > size_type unique( BinaryPredicate p ); | (начиная с C++20) |
Удаляет из контейнера все непосредственно следующие друг за другом повторяющиеся элементы. В каждой группе равных элементов остаётся только первый элемент.
Инвалидирует только итераторы и ссылки на удалённые элементы.
p.Если binary_pred не задаёт отношение эквивалентности, поведение не определено.
Параметры
| p | - | бинарный предикат, возвращающий true, если элементы следует считать равными. Сигнатура функции-предиката должна быть эквивалентна следующей: boolpred(constType1&a,constType2&b); Хотя сигнатура не обязана содержать |
| Требования к типам | ||
-BinaryPredicate должен соответствовать требованиям BinaryPredicate. |
||
Возвращаемое значение
| (нет) | (до C++20) |
| Количество удалённых элементов. | (начиная с C++20) |
Сложность
Если empty() равен true, сравнения не выполняются.
В противном случае, пусть \(\scriptsize N\)N — это std::distance(begin(), end()):
p.Примечания
| Макрос проверки поддержки | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_list_remove_return_type | 201806L | (C++20) | Изменение возвращаемого типа |
Пример
import std;
int main()
{
std::list<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2};
std::println("Before unique(): {}", c);
const auto count1 = c.unique();
std::println("After unique(): {} ({} elements removed)", c, count1);
c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
std::println("Before unique(pred): {}", c);
auto pred = [mod = 10](int x, int y) { return (x % mod) == (y % mod); };
const auto count2 = c.unique(pred);
std::println("After unique(pred): {} ({} elements removed)", c, count2);
}
Вывод:
Before unique(): [1, 2, 2, 3, 3, 2, 1, 1, 2] After unique(): [1, 2, 3, 2, 1, 2] (3 elements removed) Before unique(pred): [1, 2, 12, 23, 3, 2, 51, 1, 2, 2] After unique(pred): [1, 2, 23, 2, 51, 2] (4 elements removed)
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 1207 | C++98 | не было ясно, будут ли инвалидированы итераторы и/или ссылки | инвалидируются только итераторы и ссылки на удалённые элементы |
См. также
| удаляет подряд идущие повторяющиеся элементы в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list/unique