カスタム コンパレータを使用したセットのコンパイル
数値ではなく辞書編集的な比較によって順序付けされた整数のセットを作成しようとすると、コンパイル時に問題が発生する可能性があります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 サイトの他の関連記事を参照してください。