比較関数が厳密な演算子 "<" ではない場合、std::sort がクラッシュするのはなぜですか?
提供されている C コード スニペットは、次のことを示しています。 std::sort の使用中に、間違った比較関数が原因でクラッシュが発生しました。 std::sort は厳密な弱い順序付けルールを満たすソーターを期待しているため、問題とその解決策を詳しく見てみましょう。
コードでは、A 構造体の比較関数は a が以下であるかどうかをチェックします。 (<=) その他へ。ただし、これは厳密な弱い順序付けルールに違反します。
厳密な弱い順序付け
厳密な弱い順序付けでは、次の関係が定義されます。
コードでは、a が other.a と等しい場合でも比較関数は true を返すため、比較関数は反対称性プロパティを満たしていません。これにより、std::sort で無限ループなどの非決定的な動作が発生する可能性があります。
解決策
この問題を解決するには、比較関数を変更する必要があります。次に示すように、 a が other.a よりも厳密に小さい場合にのみ true を返すことにより、厳密な弱い順序付けルールを遵守します。以下:
struct A { bool operator <(const A& other) const { return a < other.a; // Return true only when a is strictly less than other.a } };
この修正された比較関数により、厳密な弱い順序付けルールが確実に遵守され、std::sort がクラッシュすることなく期待どおりに機能できるようになります。
以上が比較関数が厳密でない場合に std::sort がクラッシュするのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。