C では、 std::sort には、厳密な弱い順序付け ルールに従う比較関数が必要です。このルールにより、左のオペランドが右のオペランドより小さい場合にのみ、比較関数が true を返すことが保証されます。
提供されたコードを検討してください:
#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!!! } カスタム比較関数は < を返します。 ;= 等しい場合の other.a。これは、 == other.a.
比較を < に変更することにより、2 つの要素が等しいとみなされると規定しているため、厳密な弱い順序付けルールに違反します。 other.a の場合、a が other.a よりも厳密に小さい場合にのみ true を返すため、ルールは満たされます。厳密な順序付けを使用すると、等しい要素に遭遇したときにアルゴリズムが無限ループに陥るのを防ぎます。
結論として、std::sort は非演算子でクラッシュします。
この関数は厳密な弱い順序付けルールに違反し、無限ループにつながる可能性があるためです。したがって、予期しない動作を避けるために、比較関数がこのルールに準拠していることを確認することが重要です。以上が非厳密な弱い順序付け比較関数を使用すると std::sort がクラッシュするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。