Skip to main content

std::forward_list unique() method

// (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 );

Removes all consecutive duplicate elements from the container.

Only the first element in each group of equal elements is left.

Undefined Behavior

The behavior is undefined

if the selected comparator does not compare for equivalence.

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 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 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 forward_list<T, Allocator>::const_iterator can be dereferenced and then implicitly converted to both of them.

Return value

The number of elements removed. (since C++20)
(none) (until 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

Main.cpp
#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";
}
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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.

std::forward_list unique() method

// (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 );

Removes all consecutive duplicate elements from the container.

Only the first element in each group of equal elements is left.

Undefined Behavior

The behavior is undefined

if the selected comparator does not compare for equivalence.

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 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 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 forward_list<T, Allocator>::const_iterator can be dereferenced and then implicitly converted to both of them.

Return value

The number of elements removed. (since C++20)
(none) (until 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

Main.cpp
#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";
}
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
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.