ホームページ > バックエンド開発 > C++ > std::set コンテナのカスタム コンパレータを定義するにはどうすればよいですか?

std::set コンテナのカスタム コンパレータを定義するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-17 10:37:25
オリジナル
790 人が閲覧しました

How to Define a Custom Comparator for the std::set Container?

カスタム std::set コンパレータの使用

概要:

並べ替えおよび検索アルゴリズム、カスタム コンパレータは、コンテナ内の要素の代替順序を指定するために使用されます。これにより、特定の基準に基づいたカスタムの並べ替えや検索が可能になります。 std::set コンテナーのカスタム コンパレーターを定義する方法を見てみましょう。

ケース スタディ:

数値の代わりに辞書順に並べる整数のセットを考えてみましょう。注文すること。これは、数値的には「10000」の方が大きい場合でも、要素「1234」と「10000」は (辞書編集的に) 順序どおりに扱われる必要があることを意味します。

エラーと解決策:

あなたが遭遇したエラーは、g が特定のテンプレート パラメータ リストに準拠するコンパレータを予期しているためです。 「テンプレート class std::set」。コードでは、「lex_compare」は _Compare の役割を果たすことができる型ではありません。

解決策:

std のカスタム コンパレーターを定義するには、いくつかの方法があります。 ::set:

1.最新の C 20 ソリューション:

C 20 以降では、ラムダ関数をコンパレータとして直接使用できます:

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

2.最新の C 11 ソリューション:

C 11 以降では、set コンストラクターでラムダ関数を使用できます:

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

3。関数オブジェクト:

ブール値を返す Operator() 関数を使用して関数オブジェクトを定義できます:

struct Compare {
    bool operator()(const int &a, const int &b) { return a < b; }  // Arbitrary example
};

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

4。 std::integral_constant:

std::integral_constant を使用して、暗黙的に関数ポインターに変換する型を作成できます:

#include <type_traits>

struct Compare {
    bool operator()(const int &a, const int &b) { return a < b; }  // Arbitrary example
};

using Cmp = std::integral_constant<decltype(&Compare::operator()), &Compare::operator()>;

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

結論:

カスタム コンパレータを定義すると、次のようになります。セット内の要素の順序をより詳細に制御できるため、特定の並べ替え要件を達成できます。

以上がstd::set コンテナのカスタム コンパレータを定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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