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.
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>
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.
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 :
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!