Namespaces
Variants

std:: erase, std:: erase_if (std::forward_list)

From cppreference.net

Определено в заголовке <forward_list>
(1)
template < class T, class Alloc, class U >

typename std:: forward_list < T, Alloc > :: size_type

erase ( std:: forward_list < T, Alloc > & c, const U & value ) ;
(начиная с C++20)
(до C++26)
template < class T, class Alloc, class U = T >

constexpr typename std:: forward_list < T, Alloc > :: size_type

erase ( std:: forward_list < T, Alloc > & c, const U & value ) ;
(начиная с C++26)
template < class T, class Alloc, class Pred >

typename std:: forward_list < T, Alloc > :: size_type

erase_if ( std:: forward_list < T, Alloc > & c, Pred pred ) ;
(2) (начиная с C++20)
(constexpr начиная с C++26)
1) Удаляет все элементы, которые равны value из контейнера c . Эквивалентно return c. remove_if ( [ & ] ( const auto & elem ) - > bool { return elem == value ; } ) ; .
2) Удаляет все элементы, удовлетворяющие предикату pred из контейнера c . Эквивалентно return c. remove_if ( pred ) ; .

Содержание

Параметры

c - контейнер, из которого производится удаление
value - значение для удаления
pred - унарный предикат, который возвращает ​ true если элемент должен быть удалён.

Выражение pred ( v ) должно быть преобразуемо в bool для любого аргумента v типа (возможно const) T , независимо от категории значения , и не должно изменять v . Таким образом, параметр типа T & не допускается , как и T , если для T перемещение не эквивалентно копированию (since C++11) . ​

Возвращаемое значение

Количество удалённых элементов.

Сложность

Линейный.

Примечания

В отличие от std::forward_list::remove , erase принимает гетерогенные типы и не принудительно преобразует их в тип значения контейнера перед вызовом оператора == .

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_algorithm_default_value_type 202403 (C++26) Списковая инициализация для std::erase

Пример

#include <complex>
#include <iostream>
#include <numeric>
#include <string_view>
#include <forward_list>
void println(std::string_view comment, const auto& c)
{
    std::cout << comment << '[';
    bool first{true};
    for (const auto& x : c)
        std::cout << (first ? first = false, "" : ", ") << x;
    std::cout << "]\n";
}
int main()
{
    std::forward_list<char> cnt(10);
    std::iota(cnt.begin(), cnt.end(), '0');
    println("Initially, cnt = ", cnt);
    std::erase(cnt, '3');
    println("After erase '3', cnt = ", cnt);
    auto erased = std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });
    println("After erase all even numbers, cnt = ", cnt);
    std::cout << "Erased even numbers: " << erased << '\n';
    std::forward_list<std::complex<double>> nums{{2, 2}, {4, 2}, {4, 8}, {4, 2}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::erase(nums, {4, 2});
    #else
        std::erase(nums, std::complex<double>{4, 2});
    #endif
    println("After erase {4, 2}, nums = ", nums);
}

Вывод:

Initially, cnt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
After erase '3', cnt = [0, 1, 2, 4, 5, 6, 7, 8, 9]
After erase all even numbers, cnt = [1, 5, 7, 9]
Erased even numbers: 5
After erase {4, 2}, nums = [(2,2), (4,8)]

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 4135 C++20 the return type of the lambda predicate used
was deduced from predicate arguments
the return type is
explicitly specified as bool

Смотрите также

удаляет элементы, удовлетворяющие определенным критериям
(шаблон функции)
удаляет элементы, удовлетворяющие определенным критериям
(функциональный объект алгоритма)
удаляет элементы, удовлетворяющие определенным критериям
(публичная функция-член)