In C erfordert std::sort eine Vergleichsfunktion, die der Regel strikte schwache Reihenfolge entspricht. Diese Regel stellt sicher, dass die Vergleichsfunktion genau dann „true“ zurückgibt, wenn der linke Operand kleiner als der rechte Operand ist.
Beachten Sie den bereitgestellten Code:
#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!!! } Die benutzerdefinierte Vergleichsfunktion gibt einen <. zurück ;= other.a für Gleichheitsfälle. Dies verstößt gegen die strenge Regel der schwachen Ordnung, da sie besagt, dass zwei Elemente genau dann als gleich gelten, wenn a == other.a.
Durch die Änderung des Vergleichs in a < other.a, die Regel ist erfüllt, da sie nur dann true zurückgibt, wenn a strikt kleiner als other.a ist. Die Verwendung einer strikten Reihenfolge verhindert, dass der Algorithmus in eine Endlosschleife gerät, wenn er auf gleiche Elemente trifft.
Zusammenfassend lässt sich sagen, dass std::sort bei einem Nicht-Operator< abstürzt. Vergleichsfunktion, da die Funktion gegen die strenge Regel der schwachen Ordnung verstößt, was möglicherweise zu Endlosschleifen führt. Daher ist es wichtig, sicherzustellen, dass Ihre Vergleichsfunktion diese Regel einhält, um unerwartetes Verhalten zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum stürzt „std::sort' ab, wenn eine Vergleichsfunktion mit nicht strikter schwacher Reihenfolge verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!