ホームページ > バックエンド開発 > C++ > 比較関数が厳密でない場合に std::sort がクラッシュするのはなぜですか

比較関数が厳密でない場合に std::sort がクラッシュするのはなぜですか

Mary-Kate Olsen
リリース: 2024-12-29 09:12:15
オリジナル
862 人が閲覧しました

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

比較関数が厳密な演算子 "<" ではない場合、std::sort がクラッシュするのはなぜですか?

提供されている C コード スニペットは、次のことを示しています。 std::sort の使用中に、間違った比較関数が原因でクラッシュが発生しました。 std::sort は厳密な弱い順序付けルールを満たすソーターを期待しているため、問題とその解決策を詳しく見てみましょう。

コードでは、A 構造体の比較関数は a が以下であるかどうかをチェックします。 (<=) その他へ。ただし、これは厳密な弱い順序付けルールに違反します。

厳密な弱い順序付け

厳密な弱い順序付けでは、次の関係が定義されます。

  • 不反射: a はそれ自体に関連付けることはできません (a ≱ a).
  • 推移: a が b に関連し、b が c に関連している場合、a は c に関連します。
  • 反対称: a が b に関連しており、b が a に関連している場合、a は b と等しくなります (a ≈ b).

コードでは、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート