Pourquoi std::sort plante-t-il si la fonction de comparaison n'est pas un opérateur strict "<" ?
L'extrait de code C fourni démontre un crash lors de l'utilisation de std::sort en raison d'une fonction de comparaison incorrecte. Comme std::sort attend un trieur qui satisfait à la règle stricte de tri faible, examinons le problème et sa résolution.
Dans le code, la fonction de comparaison de la structure A vérifie si a est inférieur ou égal à (<=) autre.a. Cependant, cela viole la règle d'ordre faible strict.
Ordre faible strict
Un ordre faible strict définit une relation qui est :
Dans le code, la fonction de comparaison ne satisfait pas la propriété d'anti-symétrie, car elle renvoie vrai même lorsque a est égal à autre.a. Cela peut conduire à un comportement non déterministe dans std::sort, comme une boucle infinie.
Solution
Pour résoudre le problème, la fonction de comparaison doit être modifiée d'adhérer à la règle stricte de classement faible en renvoyant true uniquement lorsque a est strictement inférieur à other.a, comme indiqué ci-dessous :
struct A { bool operator <(const A& other) const { return a < other.a; // Return true only when a is strictly less than other.a } };
Ceci a été corrigé La fonction de comparaison garantit que la règle stricte de classement faible est respectée, permettant à std::sort de fonctionner comme prévu sans planter.
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!