ホームページ > バックエンド開発 > C++ > カスタム コンパレータを使用して std::set の比較基準をカスタマイズするにはどうすればよいですか?

カスタム コンパレータを使用して std::set の比較基準をカスタマイズするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-20 17:25:10
オリジナル
722 人が閲覧しました

How to Customize the Comparison Criteria in a std::set Using Custom Comparators?

std::set でカスタム コンパレーターを使用する方法

この記事では、カスタム コンパレーターを使用して 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 サイトの他の関連記事を参照してください。

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