Maison > développement back-end > C++ > Comment supprimer efficacement des éléments d'un std :: vector pendant l'itération ?

Comment supprimer efficacement des éléments d'un std :: vector pendant l'itération ?

DDD
Libérer: 2024-10-29 13:32:29
original
945 Les gens l'ont consulté

How to Efficiently Remove Elements from a std::vector During Iteration?

Supprimer efficacement des éléments d'un std :: vector pendant l'itération

Lors d'une itération sur un std :: vector et de l'exécution d'actions nécessitant une modification de la taille du vecteur, telles que la suppression éléments, vous pouvez rencontrer le problème de l'invalidation des itérateurs. En effet, la méthode delete() utilisée pour supprimer des éléments modifie la taille du vecteur et invalide tous les itérateurs existants.

Éviter les itérateurs invalides

Pour surmonter cela, une solution efficace consiste à utiliser la valeur de retour de la méthode delete(), qui fournit un nouvel itérateur valide pointant vers l'élément qui suit immédiatement celui supprimé. Cela vous permet de continuer l'itération sans avoir à vous soucier des itérateurs invalidés.

Le code suivant illustre cette approche :

<code class="cpp">std::vector<std::string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
    if (::DeleteFile(iter->c_str())) {
        iter = m_vPaths.erase(iter);  // Returns a new valid iterator
    } else {
        ++iter;  // Advance iterator if file deletion failed
    }
}</code>
Copier après la connexion

Dans ce code, l'itérateur iter est mis à jour pour pointer vers le élément suivant après chaque suppression de fichier réussie, permettant à l'itération de se dérouler sans problème.

Structures de données alternatives

Bien que l'utilisation de l'approche itérateur soit efficace, elle modifie toujours le vecteur m_vPaths d'origine, qui peut avoir des performances implications si vous devez effectuer plusieurs suppressions. Dans de tels cas, il peut être préférable d'envisager d'utiliser une structure de données alternative optimisée pour supprimer efficacement des éléments, telle que :

  • std::list: Un double lien liste qui permet une suppression efficace des éléments dans une complexité temporelle O(1).
  • std::set: Un ensemble ordonné qui supprime automatiquement les éléments en double et prend en charge des opérations de suppression efficaces.
  • std::unordered_set : Un ensemble non ordonné qui prend également en charge la suppression efficace des éléments, mais il est important de noter que l'ordre des itérations n'est pas garanti.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal