この記事では、カスタム コンパレーターを使用して std::set コンテナーの比較基準をカスタマイズするソリューションを提供します。 .
std::set は、一意の要素の順序付けされたコレクションであり、デフォルトでは要素が昇順に並べられます。 注文。ただし、独自の比較ロジックを定義して、この動作を変更することもできます。カスタム コンパレーターが役立つ次のシナリオを検討してみましょう。
この例では、std::set 内の整数の順序を辞書式順序に変更することを目的としています。数値の代わりに。各整数を文字列表現に変換し、文字列を比較するカスタム コンパレータ関数 lex_compare を定義します。ただし、このコードはコンパイルに失敗します。
このエラーは、提供されたコードがカスタム コンパレーター関数 lex_compare を引数として std::set テンプレートに渡すために発生します。ただし、 std::set の 2 番目のテンプレート パラメーターには、関数ではなく型が必要です。この問題を解決するには、次のようなさまざまな方法を使用できます。
1. Lambda 関数をコンパレータとして使用する:
auto cmp = [](int64_t a, int64_t b) { return a < b; }; std::set<int64_t, decltype(cmp)> s;
C 20 以降では、ラムダ関数をコンパレータとして直接使用できます。ラムダは 2 つの引数 (比較可能な要素) を受け取り、それらの順序を示すブール値を返します。
2.関数をコンパレータとして使用する:
bool cmp(int64_t a, int64_t b) { return a < b; } std::set<int64_t, decltype(&cmp)> s(&cmp);
ラムダ式が好まれない場合は、別のブール関数 cmp を定義して、それを std::set コンストラクターに渡すことができます。この場合、関数への参照を渡すためにアドレス演算子 (&) を指定する必要があることに注意してください。
3.関数呼び出し演算子を含む構造体の使用:
struct cmp { bool operator()(int64_t a, int64_t b) { return a < b; } }; std::set<int64_t, cmp> s;
このアプローチでは、比較ロジックを実装する関数呼び出し演算子を含む構造体を定義します。次に、構造体はセットのコンパレータとして使用されます。
これらの手法を採用することで、特定の要件を満たすように std::set の順序付け動作を効果的にカスタマイズできます。
以上がカスタム コンパレータを使用して std::set の比較基準をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。