Namespaces
Variants

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

From cppreference.net

Definido en el encabezado <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 ) ;
(desde C++20)
(hasta 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 ) ;
(desde 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) (desde C++20)
(constexpr desde C++26)
1) Elimina todos los elementos que sean iguales a value del contenedor c . Equivalente a return c. remove_if ( [ & ] ( const auto & elem ) - > bool { return elem == value ; } ) ; .
2) Elimina todos los elementos que satisfacen el predicado pred del contenedor c . Equivalente a return c. remove_if ( pred ) ; .

Contenidos

Parámetros

c - contenedor del cual borrar
value - valor a eliminar
pred - predicado unario que retorna ​ true si el elemento debe ser borrado.

La expresión pred ( v ) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) T , independientemente de la categoría de valor , y no debe modificar v . Por lo tanto, un tipo de parámetro T & no está permitido , ni tampoco T a menos que para T un movimiento sea equivalente a una copia (since C++11) . ​

Valor de retorno

El número de elementos eliminados.

Complejidad

Lineal.

Notas

A diferencia de std::forward_list::remove , erase acepta tipos heterogéneos y no fuerza una conversión al tipo de valor del contenedor antes de invocar el operador == .

Macro de prueba de características Valor Std Característica
__cpp_lib_algorithm_default_value_type 202403 (C++26) Inicialización de lista para std::erase

Ejemplo

#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);
}

Salida:

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)]

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 4135 C++20 el tipo de retorno del predicado lambda utilizado
se deducía de los argumentos del predicado
el tipo de retorno se
especifica explícitamente como bool

Véase también

elimina elementos que cumplen criterios específicos
(plantilla de función)
elimina elementos que cumplen criterios específicos
(objeto función de algoritmo)
elimina elementos que cumplen criterios específicos
(función miembro pública)