非厳密比較関数による 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 には、いわゆる「厳密な弱い順序付け」プロパティを満たす比較関数が必要です。ただし、指定されたプログラムの比較関数では、要素が等しいとみなされるだけで、厳密に互いに小さいとみなされることはありません。これによりあいまいさが生じ、並べ替えアルゴリズムで無限ループが発生する可能性があります。
厳密な弱い順序付けルール
厳密な弱い順序付けルールでは、比較関数 '> ;' (「<」にも適用可能):
比較関数の意味
指定されたコードでは、比較関数演算子
解決策
問題を解決するには、比較要素を厳密に比較するように関数を変更する必要があります:
struct A { int a; bool operator<(const A& other) const { return a < other.a; // Strict comparison } };
この変更により、プログラムは何もせずに期待どおりに実行されるはずです。クラッシュします。
以上が非厳密な未満演算子を使用すると std::sort がクラッシュするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。