std::list<T,Allocator>::unique
void unique(); | (1) | (until C++20) |
size_type unique(); | (since C++20) | |
template< class BinaryPredicate > void unique( BinaryPredicate p ); | (2) | (until C++20) |
template< class BinaryPredicate > size_type unique( BinaryPredicate p ); | (since C++20) |
Removes all consecutive duplicate elements from the container. Only the first element in each group of equal elements is left.
Invalidates only the iterators and references to the removed elements.
p to compare the elements.If binary_pred does not establish an equivalence relation, the behavior is undefined.
Parameters
| p | - | binary predicate which returns true if the elements should be treated as equal. The signature of the predicate function should be equivalent to the following: boolpred(constType1&a,constType2&b); While the signature does not need to have |
| Type requirements | ||
-BinaryPredicate must meet the requirements of BinaryPredicate. |
||
Return value
| (none) | (until C++20) |
| The number of removed elements. | (since C++20) |
Complexity
If empty() is true, no comparison is performed.
Otherwise, given \(\scriptsize N\)N as std::distance(begin(), end()):
p.Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_list_remove_return_type | 201806L | (C++20) | Change the return type |
Example
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);
}
Output:
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)
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 1207 | C++98 | it was unclear whether iterators and/or references will be invalidated | only invalidates iterators and references to the removed elements |
See also
| removes consecutive duplicate elements in a range (function template & algorithm function object) |
|
|
(C++20) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list/unique