Q&A
###前提・実現したいこと
C++のunordered_mapで、独自に作成したクラスを使いたいのですが、うまいhash化の仕方が分かりません。
調べてみて、プログラムを書いて動かしたのですが、見た目上は、うまく動いているように見えます…。ですが、心配なので、質問させていただきました。
###発生している問題・エラーメッセージ
一応、動きますが、プログラム的に問題がないものなのか分かりません。
###該当のソースコード
#include <iostream> #include <unordered_map> #include <vector> using namespace std; class A { public: A(vector<string> text, vector<int> num) { this->text = text; this->num = num; } vector<std::string> text; vector<int> num; }; bool operator==(const A &lhs, const A &rhs) { return lhs.text == rhs.text && lhs.num == rhs.num; } namespace std { template <> class hash<A> { public: size_t operator()(const A& x) const{ unsigned int s = 0; for (int i = 0; i < x.text.size(); i++) { s ^= hash<string>()(x.text[i]); } for (int i = 0; i < x.num.size(); i++) { s ^= hash<int>()(x.num[i]); } return s; } }; } int main() { A a = A({ "test","aa" }, {1,1}); A aa = A({ "test","aa" }, { 0,1 }); A b = A({ "test","aa" }, { 2,1 }); A c = A({ "test","aa" }, { 0,1 }); unordered_map<A,int> z; z[a] ++; z[aa] ++; z[b] ++; z[c] ++; for (auto itr = z.begin(); itr != z.end(); itr++) { for (int i = 0; i < itr->first.num.size(); i++) { cout << itr->first.num[i] << ","; } cout << " "; for (int i = 0; i < itr->first.text.size(); i++) { cout << itr->first.text[i].c_str() << ","; } cout << ":" << itr->second << endl; } }
###試したこと
いろいろ調べてみて、intなどをhashにする方法はわかりましたが、複数個あった場合がよく分かりません。
###補足情報(言語/FW/ツール等のバージョンなど)
C++11 , VisualStudio2017
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2017/07/06 09:16