std::list<T,Allocator>:: unique
| (1) | ||
|
void
unique
(
)
;
|
(until C++20) | |
|
size_type unique
(
)
;
|
(since C++20)
(constexpr since C++26) |
|
| (2) | ||
|
template
<
class
BinaryPred
>
void unique ( BinaryPred p ) ; |
(until C++20) | |
|
template
<
class
BinaryPred
>
size_type unique ( BinaryPred p ) ; |
(since C++20)
(constexpr since C++26) |
|
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.
Contents |
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: bool pred ( const Type1 & a, const Type2 & b ) ;
While the signature does not need to have
const
&
, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const)
|
| Type requirements | ||
-
BinaryPred
must meet the requirements of
BinaryPredicate
.
|
||
Return value
|
(none) |
(until C++20) |
|
The number of elements removed. |
(since C++20) |
Complexity
If empty() is true , no comparison is performed.
Otherwise, given N as std:: distance ( begin ( ) , end ( ) ) :
Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_list_remove_return_type
|
201806L
|
(C++20) | Change the return type |
Example
#include <iostream> #include <list> std::ostream& operator<< (std::ostream& os, std::list<int> const& container) { for (int val : container) os << val << ' '; return os << '\n'; } int main() { std::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"; }
Output:
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
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) |