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

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