[解決済み] ペアをキーにしたunordered_mapがコンパイルできないのはなぜですか?
質問
私は
unordered_map
を作り、ペアを整数でマッピングしようとしています。
#include <unordered_map>
using namespace std;
using Vote = pair<string, string>;
using Unordered_map = unordered_map<Vote, int>;
あるクラスで
Unordered_map
をプライベートメンバとして宣言しています。
しかし、コンパイルしようとすると、以下のようなエラーが発生します。
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:948:38: Implicit instantiation of undefined template 'std::__1::hash, std::__1::basic_string > >'」 と表示されます。
のような通常のマップを使用すると、このエラーは発生しません。
map<pair<string, string>, int>
の代わりに
unordered_map
.
を使用することはできないのでしょうか?
pair
をキーにすることはできないのでしょうか?
どのように解決するのですか?
キータイプに適したハッシュ関数を用意する必要があります。簡単な例です。
#include <unordered_map>
#include <functional>
#include <string>
#include <utility>
// Only for pairs of std::hash-able types for simplicity.
// You can of course template this struct to allow other hash functions
struct pair_hash {
template <class T1, class T2>
std::size_t operator () (const std::pair<T1,T2> &p) const {
auto h1 = std::hash<T1>{}(p.first);
auto h2 = std::hash<T2>{}(p.second);
// Mainly for demonstration purposes, i.e. works but is overly simple
// In the real world, use sth. like boost.hash_combine
return h1 ^ h2;
}
};
using Vote = std::pair<std::string, std::string>;
using Unordered_map = std::unordered_map<Vote, int, pair_hash>;
int main() {
Unordered_map um;
}
これは動作しますが、最適なハッシュプロパティを持ちません。
†
. あなたは以下のようなものを見てみたいかもしれません。
boost.hash_combine
のようにすると、ハッシュを結合する際の品質が向上します。これについては、前述の boost による解決策も含め、より詳細に
この回答
.
実戦で使うために Boostはまた、関数セット
hash_value
に対するハッシュ関数を提供します。
std::pair
と同様に
std::tuple
およびほとんどの標準的なコンテナです。
† より正確には、それはあまりにも多くの衝突を生成します。例えば、すべての対称的なペアは0にハッシュされ、並べ換えによってのみ異なるペアは同じハッシュを持つことになります。これはおそらくプログラミングの練習としては問題ないでしょうが、現実世界のコードのパフォーマンスを著しく低下させるかもしれません。
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] ディクショナリーで最大値を持つキーを取得する?
-
[解決済み] なぜdict[key]ではなく、dict.get(key)なのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] Const before or const after?
-
[解決済み] なぜ、ハッシュを組み合わせるのにXORがデフォルトなのですか?