[解決済み] std::hash<Key>::operator() をユーザー定義型に特化させる方法は?
2022-10-05 02:56:27
質問
でユーザー定義のキータイプをサポートするために
std::unordered_set<Key>
と
std::unordered_map<Key, Value>
を提供する必要があります。
operator==(Key, Key)
とハッシュファンクタを用意する必要があります。
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
とだけ書くと便利です。
std::unordered_set<X>
というように
デフォルトのハッシュ
タイプに対して
X
,
のように、コンパイラやライブラリと一緒に提供されるタイプのためのものです。
相談した結果
- C++標準 N3242ドラフト §20.8.12 [unord.hash] と §17.6.3.4 [hash.requirements] を参照してください。
- ブースト.アンオーダー
-
g++
include\c++\4.7.0\bits\functional_hash.h
-
VC10
include\xfunctional
- 各種 関連質問 はスタックオーバーフローで
を特殊化することが可能なようです。
std::hash<X>::operator()
:
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
C++11のコンパイラサポートはまだ実験的であり、私はClangを試したわけではありません。
-
このような特殊化を名前空間
std
? 私はそれについて複雑な気持ちです。 -
のうち、どれが
std::hash<X>::operator()
のバージョンは、C++11 標準に準拠していますか? -
ポータブルな方法はありますか?
どのように解決するのですか?
を追加することが明示的に許可され、推奨されています。
特殊化
を名前空間
std
*. ハッシュ関数を追加する正しい(そして基本的に唯一の)方法はこれです。
namespace std {
template <> struct hash<Foo>
{
size_t operator()(const Foo & x) const
{
/* your code here, e.g. "return hash<int>()(x.value);" */
}
};
}
(サポートを考慮すべき他の一般的な特殊化として
std::less
,
std::equal_to
と
std::swap
.)
*) 関係する型の1つがユーザー定義である限りは、そうでしょう。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件