如何为要在 unordered_map 中使用的字符串和枚举键创建哈希函数?
我有以下一对是无序映射的关键如何创建哈希以便它可以在 unordered_map 中使用?
enum Color {
Red,
Green
};
typedef std::pair <std::string, Color>
我尝试了以下但出现编译错误
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
size_t hash( const PairType & pair ) {
return std::hash<std::string>()(pair.first) ^
std::hash<EnumClassHash>()(pair.second);
}
typedef std::unordered_map<PairType, std::string>,
std::function<decltype(hash)>> ColorMapType;
error: invalid use of incomplete type 'struct std::hash<EnumClassHash>'
std::hash<EnumClassHash>()(pairType.second);
以下也不起作用
size_t hash( const PairType & pairType ) {
return std::hash<std::string>()(pairType.first) ^
std::hash<Color>()(pairType.second);
}
typedef std::unordered_map<PairType, std::string, \
std::function<decltype(hash)>> ColorMapType;
ColorMapType colorMap(100, hash);
error: invalid use of incomplete type 'struct std::hash<Color>'
std::hash<Color>()(pair.second
);
PS 请原谅我的格式化。我丢失了我的 gmail 密码,只能从一个小屏幕的移动应用程序发帖。
最佳答案
- 当你声明
struct EnumClassHash
, 它是它自己的东西,而不是std::hash
的特化. - 当你写
std::hash<EnumClassHash>()(pair.second)
, 模板特化std::hash<EnumClassHash>
根本不存在。
您可以:
- 声明
struct EnumClassHash
,并使用EnumClassHash
, 或 - 专攻
std::hash
进入std::hash<Color>
,并使用std::hash<Color>
, 或 - 两者兼顾,
但永远不要混合和匹配每个方法的一部分,这没有任何意义。
此外,使用 std::pair<std::string, Color>
作为 std::unordered_map
的键类型, 既不std::hash<Color>
也不EnumClassHash
事项。重要的是 std::hash<std::pair<std::string, Color>>
或您自己的散列 std::pair<std::string, Color>
类.
这是您可以遵循的食谱。
使用std::pair<std::string, Color>
作为 key 类型,您需要专门化 std::hash<std::pair<std::string, Color>>
自己。
template <>
struct std::hash<std::pair<std::string, Color>>
{
std::size_t operator()(const std::pair<std::string, Color>& p) const {
return std::hash<std::string>()(p.first) ^ std::hash<Color>()(p.second);
}
};
但在此之前,你需要专攻std::hash<Color>
自std::hash<std::pair<std::string, Color>>
以来首次使用它。
template <>
struct std::hash<Color>
{
std::size_t operator()(Color c) const {
return static_cast<size_t>(c);
}
};
然后,您可以使用类似 std::unordered_map<std::pair<std::string, Color>, std::string>
的内容.没有 EnumClassHash
涉及。
如果你爱EnumClassHash
非常喜欢,这是另一个食谱。
你可以保留EnumClassHash
随心所欲。
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
这一次,std::hash<Color>
不存在。不要使用它。 (更不用说没有意义的 std::hash<EnumClassHash>
。)
因此,哈希键类型的类应该使用 EnumClassHash
. (再一次,不是 std::hash<EnumClassHash>
!)
struct PairHash {
std::size_t operator()(const std::pair<std::string, Color>& p) const {
return std::hash<std::string>()(p.first) ^ EnumClassHash()(p.second);
}
};
现在,您可以使用 std::unordered_map<std::pair<std::string, Color>, std::string, PairHash>
.
关于c++ - 错误 : invalid use of incomplete type 'struct std::hash<>' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48294401/