Maison > développement back-end > C++ > le corps du texte

Pourquoi mon code Erase-Remove_If laisse-t-il des doublons ?

Barbara Streisand
Libérer: 2024-11-10 14:33:02
original
998 Les gens l'ont consulté

Why Is My Erase-Remove_If Code Leaving Duplicates?

Erase-Remove_If Idiom : application correcte

L'idiome Erase-remove_if est une technique polyvalente permettant de supprimer efficacement des éléments d'un conteneur en fonction d'un prédicat. Cependant, une implémentation incorrecte peut conduire à des résultats inattendus.

Dans l'exemple donné, vous visiez à supprimer les paires avec .first valeur de 4 d'un vecteur de paires à l'aide d'effacement-remove_if. Cependant, votre code vous a laissé des doublons, indiquant une erreur.

Le code correct devrait être :

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());
Copier après la connexion

L'explication réside dans le mécanisme d'effacement-suppression_if.

Comment ça marche

std::remove_if échange les éléments du vecteur pour regrouper les éléments qui ne correspondent pas le prédicat vers le début. Il renvoie ensuite un itérateur au premier élément à supprimer, marquant la séparation entre les éléments à conserver et à supprimer.

std::vector::erase commence à l'itérateur renvoyé et efface tous les éléments suivants, supprimant ainsi tous les éléments qui correspondent au prédicat.

Dans votre code initial, vous avez omis le deuxième paramètre de std::erase, ce qui a entraîné la suppression uniquement de l'élément indiqué par l'itérateur renvoyé. Cela a entraîné des doublons car les éléments suivants correspondant au prédicat n'ont pas été effacés.

En incluant le deuxième paramètre, stopPoints.end(), nous demandons à delete de supprimer la plage commençant par l'itérateur renvoyé jusqu'à la fin du vecteur, en veillant à ce que tous les éléments correspondants soient supprimés.

Pour des informations plus complètes sur l'idiome effacer-supprimer, reportez-vous à l'entrée Wikipédia : https://en.wikipedia.org/wiki/Erase–remove_idiom

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal