Spec-Zone.ru › C++

std::hive<T,Allocator>::unique

template< class BinaryPredicate = std::equal_to<T> >
size_type unique( BinaryPredicate binary_pred = BinaryPredicate() );
(начиная с C++26)

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

Формально, для непустого hive удаляются все элементы, на которые ссылается итератор i в [begin() + 1, end()) и для которых p(*i, *(i - 1)) истинно.

Ссылки, указатели и итераторы, ссылающиеся на удалённые элементы, становятся недействительными. Если удалён последний элемент в *this, итератор end() также становится недействительным.

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

Параметры

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

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

boolpred(constType1&a,constType2&b);

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

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

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

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

Сложность

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

В противном случае, если \(\scriptsize N\)N — это std::distance(begin(), end()): ровно \(\scriptsize N-1\)N-1 вызовов предиката p.

Пример

import std;

int main()
{
    std::hive<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)

См. также

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

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

Spec-Zone.ru

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