Namespaces
Variants

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

De fr.cppreference.net

 
 
 
 
Défini dans l'en-tête <list>
template< class T, class Alloc, class U >
std::list<T, Alloc>::size_type
    erase( std::list<T, Alloc>& c, const U& value );
(1) (depuis C++20)
(jusqu'à 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 );
(depuis 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) (depuis C++20)
1) Efface tous les éléments qui sont égaux à value du conteneur. Équivalent à return c.remove_if([&](const auto& elem) -> bool { return elem == value; });.
2) Efface tous les éléments qui satisfont le prédicat pred du conteneur. Équivalent à return c.remove_if(pred);.

Paramètres

c - conteneur duquel effacer
value - valeur à supprimer
pred - prédicat unaire qui retourne ​ true si l'élément doit être effacé.

L'expression pred ( v ) doit être convertible en bool pour chaque argument v de type (éventuellement const) T , indépendamment de la catégorie de valeur , et ne doit pas modifier v . Ainsi, un type de paramètre T & n'est pas autorisé , pas plus que T sauf si pour T un déplacement est équivalent à une copie (depuis C++11) . ​

Valeur de retour

Le nombre d'éléments effacés.

Complexité

Linéaire.

Notes

Contrairement à std::list::remove , erase accepte des types hétérogènes et ne force pas une conversion vers le type de valeur du conteneur avant d'invoquer l'opérateur == .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_algorithm_default_value_type 202403 (C++26) Initialisation par liste pour std::erase

Exemple

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

Sortie:

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 4135 C++20 le type de retour du prédicat lambda utilisé
était déduit des arguments du prédicat
le type de retour est
explicitement spécifié comme bool

Voir aussi

supprime les éléments satisfaisant des critères spécifiques
(fonction membre publique)
supprime les éléments satisfaisant des critères spécifiques
(modèle de fonction & objet fonction d'algorithme)
supprime les éléments satisfaisant des critères spécifiques
(objet fonction d'algorithme)