Maison > Article > développement back-end > Comment effacer en toute sécurité des éléments d'un std :: vector pendant l'itération ?
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!