C++には標準ライブラリの文字列のハッシュ関数がないようです。これは本当ですか?
任意のC++コンパイラで機能するunordered_mapのキーとして文字列を使用する実際の例は何ですか?
C++には標準ライブラリの文字列のハッシュ関数がないようです。これは本当ですか?
任意のC++コンパイラで機能するunordered_mapのキーとして文字列を使用する実際の例は何ですか?
C ++ STLは、さまざまな文字列クラス用のテンプレート特殊化を提供します。次のキータイプとして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
、同じ取引です):wstring
キーとして使用unordered_map
すると、そのタイプで使用できるハッシュ関数がないというエラーが生成されます。
私にとっての解決策は、次を追加することでした。
#include <string>
信じられないかもしれませんが、#include
ディレクティブがなくても、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
次に、たとえばSTLを作成する場合は、テンプレートを使用して何もしなくても、STLがと関数std::unordered_map<CustomType>
を検索します。これが、順序付けされていないデータ構造をサポートするカスタム等式比較子を作成する方法です。hash
equal_to
私の場合、それは本当に気を散らすものでした。
私はconst&Xのハッシュを実装したタイプXを持っていて、それをどこかで利用しました
std::unordered_map<const X, int> m_map;
次に、キーがそのタイプX
であり、実行した別のマップが必要でした。
std::unordered_map<X, int> map_x;
2番目のケースのの欠如に注意してください。const