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.
operator== to compare the 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:
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 N as std::distance(begin(), end()):
operator==.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) |