From cppreference.com
voidunique(); (1)(until C++20)size_typeunique();(since C++20)template<classBinaryPredicate>voidunique(BinaryPredicatep); (2)(until C++20)template<classBinaryPredicate>size_typeunique(BinaryPredicatep);(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.
1) Uses operator== to compare the elements.
2) Uses 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 const&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) Type1 and Type2 regardless of
(thus, Type1& is not allowed, nor is Type1 unless for Type1 a move is equivalent to a copy(since C++11)).
The types Type1 and Type2 must be such that an object of type list<T,Allocator>::const_iterator can be dereferenced and then implicitly converted to both of them.
Type requirements -BinaryPredicate must meet the requirements of
. Return value
(none)
(until C++20)The number of removed elements.
(since C++20)Complexity
If
is true, no comparison is performed.
Otherwise, given N as std::distance(begin(),end()):
1) Exactly N-1 comparisons using operator==.
2) Exactly N-1 applications of the predicate p.
Notes
macro ValueStdFeature
__cpp_lib_list_remove_return_type
(C++20)Change the return type Example
Run this code
importstd;intmain(){std::list<int>c{1,2,2,3,3,2,1,1,2};std::println("Before unique(): {}",c);constautocount1=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);autopred=[mod=10](intx,inty){return(x%mod)==(y%mod);};constautocount2=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
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)