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());
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!