Spec-Zone.ru › C++

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)

Удаляет из контейнера все непосредственно следующие друг за другом повторяющиеся элементы. В каждой группе равных элементов остаётся только первый элемент.

Инвалидирует только итераторы и ссылки на удалённые элементы.

1) Для сравнения элементов используется operator==.
2) Для сравнения элементов используется p.

Если binary_pred не задаёт отношение эквивалентности, поведение не определено.

Параметры

p - бинарный предикат, возвращающий ​true, если элементы следует считать равными.

Сигнатура функции-предиката должна быть эквивалентна следующей:

boolpred(constType1&a,constType2&b);

Хотя сигнатура не обязана содержать const &, функция не должна изменять переданные ей объекты и должна принимать любые значения типа (возможно, const) Type1 и Type2 независимо от категории значения (поэтому Type1 & не допускается; также не допускается Type1, если только для Type1 перемещение не эквивалентно копированию(начиная с C++11)).
Типы Type1 и Type2 должны быть такими, чтобы объект типа list<T,Allocator>::const_iterator можно было разыменовать и затем неявно преобразовать к обоим этим типам. ​

Требования к типам
-BinaryPredicate должен соответствовать требованиям BinaryPredicate.

Возвращаемое значение

(нет)

(до C++20)

Количество удалённых элементов.

(начиная с C++20)

Сложность

Если empty() равен true, сравнения не выполняются.

В противном случае, пусть \(\scriptsize N\)N — это std::distance(begin(), end()):

1) Ровно \(\scriptsize N-1\)N-1 сравнений с использованием operator==.
2) Ровно \(\scriptsize N-1\)N-1 вызовов предиката 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 не было ясно, будут ли инвалидированы итераторы
и/или ссылки
инвалидируются только итераторы и
ссылки на удалённые элементы

См. также

unique
удаляет подряд идущие повторяющиеся элементы в диапазоне
(шаблон функции и функциональный объект алгоритма)
ranges::unique
(C++20)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list/unique

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API