ホームページ >バックエンド開発 >C++ >`std::sort` がクラッシュするのはなぜですか? (そしてそれを修正する方法)

`std::sort` がクラッシュするのはなぜですか? (そしてそれを修正する方法)

Susan Sarandon
Susan Sarandonオリジナル
2024-12-14 16:22:14762ブラウズ

Why Does My `std::sort` Crash?  (And How to Fix It)

std::sort によるコンパイラのクラッシュについて

C 標準ライブラリ関数 std::sort は、データの並べ替えにおいて重要な役割を果たします構造物。ただし、すべての比較関数が std::sort で期待どおりに動作するわけではなく、プログラムのクラッシュにつながる可能性があります。

次のコード スニペットを考えてみましょう:

#include <algorithm>

struct A
{
    int a;
};

bool compare(const A& a, const A& b)
{
    return a.a <= b.a; // Corrected from original code (<)
}

int main()
{
    A coll[8];
    std::sort(&coll[0], &coll[8]);
}

問題:

元のコードでは、比較関数 Compare は a.a <= b.a を使用して要素を比較します。等しい要素はソート済みとみなされます。これは、std::sort で必要な 厳密な弱い順序付け ルールに違反しています。

解決策:

厳密な弱い順序付けルールに従って、シーケンス内の要素 A、B、および C には、次の条件が満たされる必要があります。

  • If A A.
  • A
  • A はそれ自体と等しくすることはできません (つまり、A != A)。

元の比較関数 Compare は、A が次と等しくなることを許可しているため、このルールを満たしません。それ自体が std::sort 内で無限ループを引き起こす可能性があります。これを修正するには、比較関数を上記のコード スニペットに示されている修正バージョンに置き換える必要があります。

以上が`std::sort` がクラッシュするのはなぜですか? (そしてそれを修正する方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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