C++には、標準ライブラリの文字列用のハッシュ関数がないようです。これは本当ですか?
任意のC++コンパイラで動作するunordered_mapのキーとして文字列を使用する実用的な例は何ですか?
C++ STLは、さまざまな文字列クラスのテンプレート specializations of std::hash
を提供します。 std::string
のキータイプとしてstd::unordered_map
を指定できます。
#include <string>
#include <unordered_map>
int main()
{
std::unordered_map<std::string, int> map;
map["string"] = 10;
return 0;
}
今日私はこれに遭遇しました(実際にはwstring
ではなくstring
でしたが、同じことです):unordered_map
のキーとしてwstring
を使用するとエラーが発生しますそのタイプで利用可能なハッシュ関数がないことについて。
私にとっての解決策は以下を追加することでした:
#include <string>
信じられないかもしれませんが、インクルードなしでは、まだwstring型を使用できましたが、明らかにハッシュのような補助機能はありませんでした。上記のインクルードを追加するだけで修正されました。
実際、std::hash<std::string>
ただし、別のハッシュ関数を使用する方法は次のとおりです。
struct StringHasher {
size_t operator()(const std::string& t) const {
//calculate hash here.
}
}
unordered_map<std::string, ValueType, StringHasher>
CustomType
があり、STLインフラストラクチャにプラグインしたい場合、これが可能です。
namespace std
{
//namespace tr1
//{
// Specializations for unordered containers
template <>
struct hash<CustomType> : public unary_function<CustomType, size_t>
{
size_t operator()(const CustomType& value) const
{
return 0;
}
};
//} // namespace tr1
template <>
struct equal_to<CustomType> : public unary_function<CustomType, bool>
{
bool operator()(const CustomType& x, const CustomType& y) const
{
return false;
}
};
} // namespace std
次にstd::unordered_map<CustomType>
を作成したい場合、STLはhash
およびequal_to
関数を見つけますが、テンプレートでこれ以上何もする必要はありません。これが、順序付けられていないデータ構造をサポートするカスタムの等値比較子を作成する方法です。
私の場合、それは本当に気晴らしでした。
私はconst&Xのハッシュを実装したタイプXを持っていて、どこかでそれを利用しました
std::unordered_map<const X, int> m_map;
それから、キーがX
型である別のマップが必要でした。
std::unordered_map<X, int> map_x;
2番目の場合のconst
の[〜#〜] lack [〜#〜]に注意してください。