Namespaces
Variants

std::erase, std::erase_if(std::list)

De es.cppreference.net

 
 
 
 
Definido en el encabezado <list>
template< class T, class Alloc, class U >
std::list<T, Alloc>::size_type
    erase( std::list<T, Alloc>& c, const U& value );
(1) (desde C++20)
(hasta C++26)
template< class T, class Alloc, class U = T >
std::list<T, Alloc>::size_type
    erase( std::list<T, Alloc>& c, const U& value );
(desde C++26)
template< class T, class Alloc, class Pred >
std::list<T, Alloc>::size_type
    erase_if( std::list<T, Alloc>& c, Pred pred );
(2) (desde C++20)
1) Borra todos los elementos que se comparan igual a value del contenedor. Equivalente a return c.remove_if([&](const auto& elem) -> bool { return elem == value; });.
2) Borra todos los elementos que satisfacen el predicado pred del contenedor. Equivalente a return c.remove_if(pred);.

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::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 <numeric>
#include <print>
#include <list>

template<typename T>
struct std::formatter<std::complex<T>, char>
{
    template<class ParseContext>
    constexpr ParseContext::iterator parse(ParseContext& ctx)
    {
        return ctx.begin();
    }

    template<class FmtContext>
    FmtContext::iterator format(const auto& s, FmtContext& ctx) const
    {
        auto out{std::format("({},{})", s.real(), s.imag())};
        return std::ranges::copy(std::move(out), ctx.out()).out;
    }
};

int main()
{
    std::list<char> cnt(10);
    std::iota(cnt.begin(), cnt.end(), '0');
    std::println("Initially, cnt = {}", cnt);

    std::erase(cnt, '3');
    std::println("After erase '3', cnt = {}", cnt);

    auto erased = std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });
    std::println("After erase all even numbers, cnt = {}", cnt);
    std::println("Erased even numbers: {}", erased);

    std::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
    std::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
(public member function)
elimina elementos que cumplen criterios específicos
(function template & algorithm function object)
elimina elementos que cumplen criterios específicos
(algorithm function object)