Namespaces
Variants

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

From cppreference.net

(1)
void unique ( ) ;
(начиная с C++11)
(до C++20)
size_type unique ( ) ;
(начиная с C++20)
(constexpr начиная с C++26)
(2)
template < class BinaryPred >
void unique ( BinaryPred p ) ;
(начиная с C++11)
(до C++20)
template < class BinaryPred >
size_type unique ( BinaryPred p ) ;
(начиная с C++20)
(constexpr начиная с C++26)

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

1) Эквивалентно unique ( std:: equal_to < T > ( ) ) (до C++14) unique ( std:: equal_to <> ( ) ) (начиная с C++14) .
2) Использует p для сравнения элементов.
Если p не задает отношение эквивалентности, поведение не определено.

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

Содержание

Параметры

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

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

bool pred ( const Type1 & a, const Type2 & b ) ;

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

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

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

(нет)

(until C++20)

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

(since C++20)

Сложность

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

В противном случае, при заданном N как std:: distance ( begin ( ) , end ( ) ) :

1) Ровно N-1 сравнений с использованием operator == .
2) Ровно N-1 применений предиката p .

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_list_remove_return_type 201806L (C++20) Изменение типа возвращаемого значения

Пример

#include <iostream>
#include <forward_list>
std::ostream& operator<< (std::ostream& os, std::forward_list<int> const& container)
{
    for (int val : container)
        os << val << ' ';
    return os << '\n';
}
int main()
{
    std::forward_list<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2};
    std::cout << "Before unique(): " << c;
    const auto count1 = c.unique();
    std::cout << "After unique():  " << c
              << count1 << " elements were removed\n";
    c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
    std::cout << "\nBefore unique(pred): " << c;
    const auto count2 = c.unique([mod = 10](int x, int y)
    {
        return (x % mod) == (y % mod);
    });
    std::cout << "After unique(pred):  " << c
              << count2 << " elements were removed\n";
}

Вывод:

Before unique(): 1 2 2 3 3 2 1 1 2
After unique():  1 2 3 2 1 2
3 elements were 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 were removed

Смотрите также

удаляет последовательные дублирующиеся элементы в диапазоне
(шаблон функции)