2012-03-15 12 views
0

私はstd :: stringsの順序のないセットを使用しています。ハッシュ関数を指定するための推奨方法は何ですか?現在、デフォルトを使用しています。私は明示的に実行することができるものを明示的に指定する必要がありますか?unordered_setsで使用するとstd :: stringにハッシュ関数が必要ですか?

+0

明示的に別のものを指定することもできますが、これはパフォーマンスが向上する場合もありますが、必ずしも必要ではありません。あなたの本当の質問は何ですか? – ildjarn

+0

質問は - デフォルトのstd :: stringのためにうまくいくかどうか –

+2

確かにそう望むでしょう!さもなければ、なぜコンパイラのベンダーが標準ライブラリをそれを出荷するのですか? – ildjarn

答えて

0

あなた自身で提供する必要はありません。あなたがstd::stringのためにVS 2010のハッシュ関数を使用している場合、あなたはそれがあなたのニーズを満たすかどうかについての自分のために見てみたい場合は<functional>に含まxfunctionalヘッダファイルにあります。

template<> 
    class hash<_STD string> 
// ... 
1

std::stringするための標準的な分業おそらく一般的に文字列のために(おそらく非常に良い)十分です。しかし、非常に特殊な形式の文字列を使って作業している場合、おそらく特定のケースでより良いアルゴリズムを見つけたり設計したりすることができます。

0

あなたはハッシュ関数を指定するために、あなたが何か書くべきことがわかりますwiki、チェックすることができます:

hash_Xは、ハッシュ関数の定義である
std::unordered_map<X,int,hash_X> my_map; 

を。完全のために

私はwiki

struct X{int i,j,k;}; 

struct hash_X{ 
    size_t operator()(const X &x){ 
    return hash<int>()(x.i)^hash<int>()(x.j)^hash<int>()(x.k); 
    } 
}; 
0

で見つかった定義のコードが含まれ、私はまだ答えの下に少しコメントを追加する方法を考え出したていない...私はこの下を掲示することを好みますマイケルバーの答え。とにかく、C++ 11はstd::hash<string>をライブラリの一部として持っています。 Hereでは、サポートされているすべてのハッシュ関数を表示できます。