std::forward_list unique() method
- od C++20
- od C++11
// (1) Non const version only
size_type remove( const T& value );
// (2) Non const version only
template< class UnaryPredicate >
size_type remove_if( UnaryPredicate p );
// (1) Non const version only
void remove( const T& value );
// (2) Non const version only
template< class UnaryPredicate >
void remove_if( UnaryPredicate p );
Removes all consecutive duplicate elements from the container.
Only the first element in each group of equal elements is left.
The behavior is undefined
if the selected comparator does not compare for equivalence.Parameters
-
which returnsp
- binary predicatetrue
if the elements should be treated as equal.The signature of the predicate function should be equivalent to the following:
bool cmp( 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
andType2
regardless of value category (thus,Type1&
is not allowed , nor isType1
unless forType1
a move is equivalent to a copy (od C++11)).The types
Type1
andType2
must be such that an object of typeforward_list<T, Allocator>::const_iterator
can be dereferenced and then implicitly converted to both of them.
Return value
The number of elements removed. (od C++20)(none) (do C++20)
Complexity
Exactly std::distance(begin(), end()) - 1
comparisons of the elements, if the container is not empty. Otherwise, no comparison is performed.
Exceptions
(none)
Notes
Feature testing macro: __cpp_lib_list_remove_return_type
.
Example
#include <iostream>
#include <forward_list>
auto print = [](auto remark, auto const& container) {
std::cout << remark;
for (auto const& val : container)
std::cout << ' ' << val;
std::cout << '\n';
};
int main()
{
std::forward_list<int> c = {1, 2, 2, 3, 3, 2, 1, 1, 2};
print("Before unique():", c);
const auto count1 = c.unique();
print("After unique(): ", c);
std::cout << count1 << " elements were removed\n";
c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
print("Before unique(pred):", c);
const auto count2 = c.unique([mod=10](int x, int y) {
return (x % mod) == (y % mod);
});
print("After unique(pred): ", c);
std::cout << count2 << " elements were removed\n";
}
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
Hover to see the original license.