ホームページ >バックエンド開発 >C++ >非厳密な未満演算子を使用すると std::sort がクラッシュするのはなぜですか?

非厳密な未満演算子を使用すると std::sort がクラッシュするのはなぜですか?

DDD
DDDオリジナル
2024-12-14 12:29:20695ブラウズ

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

非厳密比較関数による std::sort 例外

VC 2012 でコンパイルされた次のプログラムは、予期しない動作を示します。

#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;
}

問題説明

この問題は、比較関数演算子<が原因で発生します。 std::sort の要件に厳密に従っていません。 C 標準ライブラリ (セクション 25.3.1.1) によると、std::sort には、いわゆる「厳密な弱い順序付け」プロパティを満たす比較関数が必要です。ただし、指定されたプログラムの比較関数では、要素が等しいとみなされるだけで、厳密に互いに小さいとみなされることはありません。これによりあいまいさが生じ、並べ替えアルゴリズムで無限ループが発生する可能性があります。

厳密な弱い順序付けルール

厳密な弱い順序付けルールでは、比較関数 '> ;' (「<」にも適用可能):

  • > の場合、 b、次に b !
  • a >= b かつ b >= a の場合、a == b

比較関数の意味

指定されたコードでは、比較関数演算子

解決策

問題を解決するには、比較要素を厳密に比較するように関数を変更する必要があります:

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

この変更により、プログラムは何もせずに期待どおりに実行されるはずです。クラッシュします。

以上が非厳密な未満演算子を使用すると std::sort がクラッシュするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。