似乎C ++没有标准库中字符串的哈希函数。这是真的吗?
在unordered_map中使用字符串作为键可以使用任何c ++编译器的工作示例是什么?
答案 0 :(得分:27)
C ++ STL为各种字符串类提供std::hash
的模板specializations。您只需指定std::string
作为std::unordered_map
的关键字类型:
#include <string>
#include <unordered_map>
int main()
{
std::unordered_map<std::string, int> map;
map["string"] = 10;
return 0;
}
答案 1 :(得分:18)
我今天遇到了这个问题(实际上是wstring
,而不是string
,但这是相同的交易):使用wstring
作为unordered_map
中的密钥会产生错误关于没有可用于该类型的哈希函数。
我的解决方案是添加:
#include <string>
信不信由你,如果没有包含,我仍然可以使用wstring类型,但显然不是哈希这样的辅助功能。只需添加上面的包含修复它。
答案 2 :(得分:13)
实际上,有std::hash<std::string>
但是你可以使用另一个哈希函数:
struct StringHasher {
size_t operator()(const std::string& t) const {
//calculate hash here.
}
}
unordered_map<std::string, ValueType, StringHasher>
答案 3 :(得分:7)
如果你有一个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
函数,而无需您对模板执行任何其他操作。这就是我喜欢编写支持无序数据结构的自定义相等比较器的方法。
答案 4 :(得分:0)
就我而言,这真的让人分心。
我有一个X型,我为 const&amp; X 在某处
使用它std::unordered_map<const X, int> m_map;
然后我想要另一张地图,其中哪个键的类型为X
并且确实:
std::unordered_map<X, int> map_x;
请注意第二种情况下const
的 LACK 。