[解決済み] カスタムstd::setコンパレータを使用する
2022-04-25 02:16:15
質問
整数の集合の項目のデフォルトの順序を、数値ではなく辞書式に変更しようとしているのですが、g++で次のようにコンパイルすることができません。
ファイル.cppを作成します。
bool lex_compare(const int64_t &a, const int64_t &b)
{
stringstream s1,s2;
s1 << a;
s2 << b;
return s1.str() < s2.str();
}
void foo()
{
set<int64_t, lex_compare> s;
s.insert(1);
...
}
以下のようなエラーが発生します。
error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Compare, class _Alloc> class std::set’
error: expected a type, got ‘lex_compare’
私は何を間違えているのでしょうか?
どうすればいいですか?
1. モダンC++20ソリューション
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
を使用します。 ラムダ関数 をコンパレータとして使用します。通常、コンパレータはブール値を返す必要があり、これは最初の引数として渡された要素が、具体的には次の引数の前に行くものと見なされるかどうかを示します。 厳密な弱い順序 が定義されています。
2. モダンC++11ソリューション
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
C++20以前では、コンストラクタを設定する際にラムダを引数として渡す必要がありました。
3. 最初の解決策と似ていますが、ラムダの代わりに関数を使用しています。
コンパレータを通常のブール関数にする
bool cmp(int a, int b) {
return ...;
}
そして、このどちらかの方法で、使ってください。
std::set<int, decltype(cmp)*> s(cmp);
またはこのように
std::set<int, decltype(&cmp)> s(&cmp);
4.構造体を使った古い解決策
()
オペレータ
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
5. 代替案:ブーリアン関数から構造体を作成する。
ブーリアン関数を取る
bool cmp(int a, int b) {
return ...;
}
そして、それを使って構造体を作る
std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
最後に、構造体をコンパレータとして使用します。
std::set<X, Cmp> set;
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++の余分な資格エラー
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】C++11のラムダ式って何?