Maison >développement back-end >C++ >Comment effacer en toute sécurité des éléments d'un std :: vector pendant l'itération ?

Comment effacer en toute sécurité des éléments d'un std :: vector pendant l'itération ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 12:24:02976parcourir

How to Safely Erase Elements From a std::vector During Iteration?

Effacer des éléments d'un std :: vector pendant l'itération : stratégies et performances

Lors d'une itération dans un std :: vector tout en ayant besoin d'effacer éléments basés sur une condition, l'approche traditionnelle utilisant une boucle for avec des itérateurs peut rencontrer des problèmes. L'effacement d'un élément invalide l'itérateur, rendant la boucle incomplète. Pour relever ce défi, explorons les stratégies optimales pour gérer de tels scénarios.

Itération avec suivi des invalidations

Une approche consiste à suivre explicitement l'invalidation de l'itérateur provoquée par l'effacement d'éléments. Dans l'exemple de code fourni :

<code class="cpp">for (iterator it = begin; it != end(container) /* !!! */; )
{
    if (it->somecondition())
    {
        it = vec.erase(it); // Returns the new iterator to continue from.
    }
    else
    {
        ++it;
    }
}</code>

La principale différence ici est l'utilisation de end(container) au lieu d'une fin précalculée, qui met à jour la référence de l'itérateur après chaque opération d'effacement. Cela garantit des comparaisons d'itérateurs valides pendant la boucle.

Combiner std::remove_if et delete

Une approche plus efficace consiste à combiner les fonctions std::remove_if et delete. Cela optimise le processus en supprimant le besoin de suivi d'invalidation :

<code class="cpp">iterator it = std::remove_if(begin, end, pred);
vec.erase(it, vec.end());</code>

Ici, pred représente un prédicat de suppression qui détermine les éléments à supprimer. Cette approche élimine la complexité O(N^2) associée à l'effacement itéré et améliore les performances en O(N).

Exemples d'applications

Dans l'exemple de code fourni, la structure RemoveTimedEvent sert de prédicat de suppression pour identifier et supprimer les événements associés à un widget spécifique dans un vecteur d'événements chronométrés.

Par en tirant parti de l'une de ces stratégies, vous pouvez effacer efficacement des éléments d'un std::vector pendant l'itération tout en conservant les fonctionnalités et les performances correctes de l'itérateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn