Maison > développement back-end > C++ > Pourquoi mon code Erase-Remove_If laisse-t-il des doublons ?

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

Barbara Streisand
Libérer: 2024-11-10 14:33:02
original
1115 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!

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