ホームページ > バックエンド開発 > C++ > 非厳密な弱い順序付け比較関数を使用すると std::sort がクラッシュするのはなぜですか?

非厳密な弱い順序付け比較関数を使用すると std::sort がクラッシュするのはなぜですか?

DDD
リリース: 2024-12-18 13:57:11
オリジナル
903 人が閲覧しました

Why Does `std::sort` Crash When Using a Non-Strict Weak Ordering Comparison Function?

非演算子を使用すると std::sort がクラッシュするのはなぜですか<比較関数?

C では、 std::sort には、厳密な弱い順序付け ルールに従う比較関数が必要です。このルールにより、左のオペランドが右のオペランドより小さい場合にのみ、比較関数が true を返すことが保証されます。

提供されたコードを検討してください:

#include 

struct 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 サイトの他の関連記事を参照してください。

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