似乎 C++ 在标准库中没有字符串的散列函数。这是真的?
什么是在 unordered_map 中使用字符串作为键的工作示例,可以与任何 c++ 编译器一起使用?
似乎 C++ 在标准库中没有字符串的散列函数。这是真的?
什么是在 unordered_map 中使用字符串作为键的工作示例,可以与任何 c++ 编译器一起使用?
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
, not string
,但它是相同的交易):wstring
在 an 中使用 as a key 会unordered_map
生成一个关于该类型没有可用的哈希函数的错误。
我的解决方案是添加:
#include <string>
信不信由你,没有#include
指令我仍然有wstring
可用的类型,但显然没有像散列这样的辅助功能。只需添加上面的包含即可修复它。
Actually, there is std::hash<std::string>
But there it is how you can use another hash function:
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
功能,而无需您对模板做更多的事情。这就是我喜欢编写支持无序数据结构的自定义相等比较器的方式。
就我而言,这真的很分散注意力。
我有一个 X 类型,我为它实现了const& X的散列,并在某处使用它
std::unordered_map<const X, int> m_map;
然后我想要另一张地图,其中的钥匙属于该类型X
并做了:
std::unordered_map<X, int> map_x;
注意第二种情况的LACK。const