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 ?
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 :
#includestruct 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!