看来,如果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
,不是string
,但它是相同的交易):使用wstring
作为一个关键unordered_map
产生约没有哈希函数是用于该类型的错误。
对我来说,解决办法是补充:
#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
功能,您无需做任何更多与模板。 这是我喜欢写支持无序的数据结构,我的自定义相等比较。
在我的情况真的很分心。
我有一个X型对于我实现的利用它的地方,与散列为常量&X
std::unordered_map<const X, int> m_map;
然后,我想有另一个地图,关键是类型的X
和做的:
std::unordered_map<X, int> map_x;
注意缺乏 const
的第二种情况。