ホームページ > バックエンド開発 > C++ > C でカスタム コンパレータを使用してセットを正しくコンパイルするにはどうすればよいですか?

C でカスタム コンパレータを使用してセットを正しくコンパイルするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-21 00:56:10
オリジナル
979 人が閲覧しました

How to Correctly Compile a Set with a Custom Comparator in C  ?

カスタム コンパレータを使用したセットのコンパイル

数値ではなく辞書編集的な比較によって順序付けされた整数のセットを作成しようとすると、コンパイル時に問題が発生する可能性がありますwith g .

発生したエラーは、テンプレート パラメータのタイプが正しくないことが原因です。セット。提供されたコードでは:

set<int64_t, lex_compare> s;
ログイン後にコピー

lex_compare は型ではなく関数です。これを修正するには、 C のテンプレート要件に従ってコンパレータ オブジェクトを作成する必要があります。

最新の C ソリューション

1. C 20 の解決策:

auto cmp = [](int64_t a, int64_t b) { return ... };
std::set<int64_t, decltype(cmp)> s;
ログイン後にコピー

ラムダは C 20 のコンパレータとして使用できます。ラムダは要素の順序を示すブール値を返す必要があります。

2 。 C 11 の解決策:

auto cmp = [](int64_t a, int64_t b) { return ... };
std::set<int64_t, decltype(cmp)> s(cmp);
ログイン後にコピー

C 11 では、ラムダを引数として set コンストラクターに渡す必要があります。

従来の解決策

3.関数ポインタ:

bool cmp(int64_t a, int64_t b) {
    return ...;
}
std::set<int64_t, decltype(cmp)*> s(cmp);
ログイン後にコピー

4. Operator() を含む構造体:

struct cmp {
    bool operator() (int64_t a, int64_t b) const {
        return ...
    }
};

std::set<int64_t, cmp> s;
ログイン後にコピー

5.ブール関数からの構造体:

bool cmp(int64_t a, int64_t b) {
    return ...;
}

#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
std::set<int64_t, Cmp> set;
ログイン後にコピー

以上がC でカスタム コンパレータを使用してセットを正しくコンパイルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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