Maison > développement back-end > C++ > Pourquoi `std::sort` plante lorsque la fonction de comparaison n'est pas stricte '

Pourquoi `std::sort` plante lorsque la fonction de comparaison n'est pas stricte '

Mary-Kate Olsen
Libérer: 2024-12-29 09:12:15
original
864 Les gens l'ont consulté

Why Does `std::sort` Crash When the Comparison Function Isn't a Strict

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 :

  • Irréflexif : a ne peut pas être lié à lui-même (a ≱ a).
  • Transitif : Si a est lié à b et b est lié à c, alors a est lié à c.
  • Anti-symétrique : Si a est lié à b, et b est lié à a, alors a est égal à b (a ≈ b).

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
    }
};
Copier après la connexion

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!

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