std::list::unique(3)
πΈ NAME πΈ
okay so bestie, this is std::list::unique β as in std::list::unique(3) β from the C++ Standard Library, and it is literally the βconsecutive dupes? not on my watchβ member function. It removes all consecutive duplicate elements from the container. Only the first element in each group of equal elements is left. And the important tea: it invalidates only the iterators and references to the removed elements. π
β¨ SYNOPSIS β¨
void unique(); (until C++20)
size_type unique(); (since C++20)
template< class BinaryPredicate > (1) (until C++20)
void unique( BinaryPredicate p ); (2)
template< class BinaryPredicate > (since C++20)
size_type unique( BinaryPredicate p );
So basically:
- Uses
operator==to compare the elements. - Uses
pto compare the elements.
β οΈ Undefined behavior alert, no cap: the behavior is undefined if the corresponding comparator does not establish an equivalence relation. That is not a vibe you want.
π PARAMETERS π
pβ a binary predicate which returnstrueif 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) Type1 and Type2 regardless of value category. 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 π¦
BinaryPredicatemust meet the requirements ofBinaryPredicate.
π 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()):
- Exactly
N-1comparisons usingoperator==. - Exactly
N-1applications of the predicatep.
π NOTES π
Feature-test macro moment:
__cpp_lib_list_remove_return_typeβ value201806L, standard(C++20), feature: βChange the return typeβ.
π§ͺ EXAMPLE π§ͺ
Run this code, bestie β itβs giving main character energy:
#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.
LWG 1207β applied toC++98. Behavior as published: it was unclear whether iterators and/or references will be invalidated. Correct behavior: only invalidates iterators and references to the removed elements.
π SEE ALSO π
uniqueβ removes consecutive duplicate elements in a range (function template).
mwah π this page is sourced from http://cppreference.com, dated 2024.06.10, and yeah bestie, itβs still std::list::unique(3) β periodt. π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms