Maison >développement back-end >C++ >Pourquoi `std::sort` plante-t-il lors de l'utilisation d'une fonction de comparaison d'ordres faibles non stricte ?

Pourquoi `std::sort` plante-t-il lors de l'utilisation d'une fonction de comparaison d'ordres faibles non stricte ?

DDD
DDDoriginal
2024-12-18 13:57:11909parcourir

Why Does `std::sort` Crash When Using a Non-Strict Weak Ordering Comparison Function?

Pourquoi std::sort plante-t-il avec un non-opérateur< Fonction de comparaison ?

En C , std::sort nécessite une fonction de comparaison qui adhère à la règle de ordre strict faible. Cette règle garantit que la fonction de comparaison renvoie vrai si et seulement si l'opérande de gauche est inférieur à l'opérande de droite.

Considérez le code fourni :

#include 

struct A {
  A() : a() {}

  bool operator<(const A& other) const {
    return a <= other.a;
  }

  int a;
};

int main() {
  A coll[8];
  std::sort(&coll[0], &coll[8]); // Crash!!!
}

La fonction de comparaison personnalisée renvoie un < ;= other.a pour les cas d'égalité. Cela viole la règle stricte d'ordre faible, car elle stipule que deux éléments sont considérés comme égaux si et seulement si a == other.a.

En changeant la comparaison en a < other.a, la règle est satisfaite car elle renvoie vrai uniquement lorsque a est strictement inférieur à other.a. L'utilisation d'un ordre strict empêche l'algorithme d'entrer dans une boucle infinie lorsqu'il rencontre des éléments égaux.

En conclusion, std::sort plante avec un non-opérateur< fonction de comparaison car la fonction viole la règle stricte d’ordre faible, conduisant potentiellement à des boucles infinies. Par conséquent, il est crucial de vous assurer que votre fonction de comparaison respecte cette règle pour éviter tout comportement inattendu.

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:
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