コード内で、std 内の要素を並べ替えるためのカスタム コンパレータ関数を指定しようとしています。 ::数値順ではなく辞書順を使用して設定します。ただし、エラー メッセージは、カスタム コンパレーターの宣言に型の不一致エラーがあることを示しています。
この問題は、ブール値を返す 2 つの int64_t パラメーターを持つ関数として lex_compare を宣言しているために発生します。ただし、 std::set のテンプレートでは、 std::less<> を実装するコンパレータが必要です。テンプレート。 std::less<>は次のシグネチャを持つ関数オブジェクトです:
template <typename T> struct less { bool operator()(const T& a, const T& b) const; };
この問題を解決するには、std::less<> に準拠するように lex_compare を実装する必要があります。サイン。コードを次のように変更します。
struct lex_compare { bool operator()(const int64_t& a, const int64_t& b) const { stringstream s1, s2; s1 << a; s2 << b; return s1.str() < s2.str(); } }; std::set<int64_t, lex_compare> s;
ここで、lex_compare 構造体は、2 つの int64_t 引数を受け取り、std::less<> の署名と一致するブール値を返す、operator() 関数を実装します。 。 std::set の定義でこのカスタム コンパレータを指定すると、要素を辞書順に並べ替えるためにセットの順序付け動作を変更できます。
以上がカスタム `std::set` コンパレータが型不一致エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。