Heim >Backend-Entwicklung >C++ >Warum stürzt „std::sort' mit einem nicht strikten Less-Than-Operator ab?

Warum stürzt „std::sort' mit einem nicht strikten Less-Than-Operator ab?

DDD
DDDOriginal
2024-12-14 12:29:20695Durchsuche

Why Does `std::sort` Crash with a Non-Strict Less-Than Operator?

std::sort-Ausnahme mit nicht strikter Vergleichsfunktion

Das folgende Programm, das mit VC 2012 kompiliert wurde, zeigt unerwartetes Verhalten:

#include <algorithm>

struct A {
    int a;
    bool operator<(const A& other) const {
        return a <= other.a; // Potential issue
    }
};

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

Problem Erläuterung

Das Problem entsteht, weil der Vergleichsfunktionsoperator< hält sich nicht strikt an die Anforderungen von std::sort. Laut der C-Standardbibliothek (Abschn. 25.3.1.1) erfordert std::sort Vergleichsfunktionen, die die sogenannte „Streng schwache Ordnung“-Eigenschaft erfüllen. Die Vergleichsfunktion im gegebenen Programm ermöglicht jedoch nur, dass Elemente als gleich, aber nicht streng kleiner als einander betrachtet werden. Dies kann zu Mehrdeutigkeiten führen und möglicherweise zu Endlosschleifen im Sortieralgorithmus führen.

Strenge schwache Ordnungsregel

Die strikte schwache Ordnungsregel besagt, dass für eine Vergleichsfunktion '> ;' (gilt auch für '<'):

  • Wenn ein > b, dann b !< a
  • Wenn a >= b und b >= a, dann a == b

    Implikation für die Vergleichsfunktion

    Im angegebenen Code ist der Vergleichsfunktionsoperator< verstößt gegen die strenge Regel der schwachen Ordnung, da sie Fälle zulässt, in denen Elemente gleich sein können (a == b), aber nicht streng kleiner als einander sein können (nicht a < b). Dieses nicht strikte Verhalten verstößt gegen die Anforderungen von std::sort und kann zu undefiniertem Verhalten, einschließlich eines Absturzes, führen.

    Lösung

    Um das Problem zu beheben, der Vergleich Die Funktion sollte geändert werden, um Elemente strikt zu vergleichen:

    struct A {
        int a;
        bool operator<(const A& other) const {
            return a < other.a; // Strict comparison
        }
    };

    Mit dieser Änderung sollte das Programm wie erwartet ohne Absturz laufen.

    Das obige ist der detaillierte Inhalt vonWarum stürzt „std::sort' mit einem nicht strikten Less-Than-Operator ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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