C++0x增加了
..。
我找不到
函数,如
助推
..。要实现这样的东西,最干净的方法是什么?也许,使用C++0x
发布于 2010-04-08 03:18:42
好吧,就像助推器的人那样做:
template
inline void hash_combine(std::size_t& seed, const T& v)
{
std::hash hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
发布于 2016-07-01 16:46:25
我将在这里分享它,因为它对其他寻找此解决方案的人很有用:
@KarlvonMoor
答案是,这里有一个可变模板版本,如果你必须将几个值组合在一起,它的用法会更简洁:
inline void hash_combine(std::size_t& seed) { }
template
inline void hash_combine(std::size_t& seed, const T& v, Rest... rest) {
std::hash hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
hash_combine(seed, rest...);
}
用法:
std::size_t h=0;
hash_combine(h, obj1, obj2, obj3);
这最初是为了实现一个可变的宏来轻松地使自定义类型hashable (我认为这是
函数):
#define MAKE_HASHABLE(type, ...) \
namespace std {\
template<> struct hash {\
std::size_t operator()(const type &t) const {\
std::size_t ret = 0;\
hash_combine(ret, __VA_ARGS__);\
return ret;\
}\
};\
}
用法:
struct SomeHashKey {
std::string key1;
std::string key2;
bool key3;
};
MAKE_HASHABLE(SomeHashKey, t.key1, t.key2, t.key3)
// now you can use SomeHashKey as key of an std::unordered_map
发布于 2019-02-17 06:29:59
几天前,我想出了一个稍微改进的版本
这个答案
(需要C++ 17支持):
template
void hashCombine(uint& seed, const T& v, Rest... rest)
{
seed ^= ::qHash(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
(hashCombine(seed, rest), ...);
}
上面的代码在代码生成方面更好。我在代码中使用了Qt中的qHash函数,但也可以使用任何其他散列器。
https://stackoverflow.com/questions/2590677
复制相似问题