std::forward_list<T,Allocator>:: unique
| (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) |
|
Удаляет все последовательные дублирующиеся элементы из контейнера. Остается только первый элемент в каждой группе равных элементов.
Инвалидирует только итераторы и ссылки на удаленные элементы.
Содержание |
Параметры
| p | - |
бинарный предикат, который возвращает
true
если элементы следует рассматривать как равные.
Сигнатура функции-предиката должна быть эквивалентна следующей: bool pred ( const Type1 & a, const Type2 & b ) ;
Хотя сигнатура не обязана иметь
const
&
, функция не должна модифицировать передаваемые ей объекты и должна быть способна принимать все значения типа (возможно, const)
|
| Требования к типам | ||
-
BinaryPred
должен удовлетворять требованиям
BinaryPredicate
.
|
||
Возвращаемое значение
|
(нет) |
(until C++20) |
|
Количество удалённых элементов. |
(since C++20) |
Сложность
Если empty() возвращает true , сравнение не выполняется.
В противном случае, при заданном N как std:: distance ( begin ( ) , end ( ) ) :
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__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
Смотрите также
|
удаляет последовательные дублирующиеся элементы в диапазоне
(шаблон функции) |