Heim > Backend-Entwicklung > C++ > Warum stürzt „std::sort' ab, wenn die Vergleichsfunktion nicht streng ist?

Warum stürzt „std::sort' ab, wenn die Vergleichsfunktion nicht streng ist?

Mary-Kate Olsen
Freigeben: 2024-12-29 09:12:15
Original
863 Leute haben es durchsucht

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

Warum stürzt std::sort ab, wenn die Vergleichsfunktion kein strenger Operator „<“ ist?

Das bereitgestellte C-Code-Snippet zeigt ein Absturz bei der Verwendung von std::sort aufgrund einer falschen Vergleichsfunktion. Da std::sort einen Sortierer erwartet, der die strenge Regel für schwache Ordnung erfüllt, wollen wir uns mit dem Problem und seiner Lösung befassen.

Im Code prüft die Vergleichsfunktion für die A-Struktur, ob a kleiner oder gleich ist zu (<=) other.a. Dies verstößt jedoch gegen die strenge Regel der schwachen Ordnung.

Strikte schwache Ordnung

Eine strikte schwache Ordnung definiert eine Beziehung, die wie folgt lautet:

  • Irreflexiv: a kann nicht auf sich selbst bezogen werden (a ≱ a).
  • Transitiv:Wenn a mit b verknüpft ist und b mit c verknüpft ist, dann ist a mit c verknüpft.
  • Antisymmetrisch : Wenn a mit b in Beziehung steht und b mit a in Beziehung steht, dann ist a gleich b (a ≈ b).

Im Code erfüllt die Vergleichsfunktion die Antisymmetrieeigenschaft nicht, da sie „true“ zurückgibt, selbst wenn a gleich other.a ist. Dies kann zu nicht deterministischem Verhalten in std::sort führen, beispielsweise einer Endlosschleife.

Lösung

Um das Problem zu beheben, sollte die Vergleichsfunktion geändert werden um die strikte schwache Ordnungsregel einzuhalten, indem nur dann „true“ zurückgegeben wird, wenn a strikt kleiner als other.a ist, wie unten gezeigt:

struct A
{
    bool operator <(const A& other) const
    {
        return a < other.a; // Return true only when a is strictly less than other.a
    }
};
Nach dem Login kopieren

Diese korrigierte Vergleichsfunktion gewährleistet dass die strikte schwache Ordnungsregel eingehalten wird, sodass std::sort wie erwartet ohne Abstürze funktioniert.

Das obige ist der detaillierte Inhalt vonWarum stürzt „std::sort' ab, wenn die Vergleichsfunktion nicht streng ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage