Maison > développement back-end > C++ > Pourquoi mon `std::sort` plante-t-il ? (Et comment y remédier)

Pourquoi mon `std::sort` plante-t-il ? (Et comment y remédier)

Susan Sarandon
Libérer: 2024-12-14 16:22:14
original
838 Les gens l'ont consulté

Why Does My `std::sort` Crash?  (And How to Fix It)

Comprendre les crashs du compilateur avec std::sort

La fonction de la bibliothèque standard C, std::sort, joue un rôle crucial dans le tri des données structures. Cependant, toutes les fonctions de comparaison ne se comportent pas comme prévu avec std::sort, ce qui peut entraîner des plantages du programme.

Considérez l'extrait de code suivant :

#include <algorithm>

struct A
{
    int a;
};

bool compare(const A& a, const A& b)
{
    return a.a <= b.a; // Corrected from original code (<)
}

int main()
{
    A coll[8];
    std::sort(&coll[0], &coll[8]);
}
Copier après la connexion

Problème :

Dans le code original, la fonction de comparaison compare utilise a.a <= b.a pour comparer des éléments, ce qui permet à des éléments égaux de être considéré comme trié. Cela viole la règle de ordre faible strict requise par std::sort.

Solution :

Selon la règle d'ordre faible strict, pour tout éléments A, B et C dans une séquence, les conditions suivantes doivent être remplies :

  • Si A < B, puis B > A.
  • Si A < B et B &Lt ; C, puis A &Lt ; C.
  • A ne peut pas être égal à lui-même (c'est-à-dire A != A).
  • La fonction de comparaison originale compare ne satisfait pas à cette règle car elle permet à A d'être égal à lui-même, conduisant à des boucles infinies potentielles dans std::sort. Pour résoudre ce problème, la fonction de comparaison doit être remplacée par la version corrigée affichée dans l'extrait de code ci-dessus.

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