安全方便的通用散列(用于 STL 无序集和映射)习语?
Safe and convenient generic hashing (for STL unordered set and map) idiom?
要准备一个在unordered_set
中使用的结构,需要一个散列函数。 这可以通过重载operator size_t()
(ew)或烦人地制作这样的东西来实现:
namespace std
{
template<> struct hash<MyStruct> : public unary_function<MyStruct, size_t>
{
size_t operator()(const MyStruct& mystruct) const
{
return 0; //hash here
}
};
}
有没有办法创建这样的接口:
struct Hashable
{
virtual size_t hash() = 0;
};
并设置std::hash
以适用于其任何实现? 我很确定模板不会以这种方式工作,所以这让我陷入困境。 有没有一个安全的size_t成语可以像安全布尔成语一样工作,用于投射到size_t? 还是别的什么? 为每个结构编写新的std::hash
专用化是愚蠢的,而每个结构中的公共接口和成员函数会方便得多。
实际上还有另一种解决方案:
template <typename T>
struct Hashable {
size_t operator()(T const& t) { return hash_value(t); }
};
template <typename T, typename E = std::equal<T>, typename A = std::allocator<T>>
using MySet = std::unordered_set<T, Hashable<T>, E, A>;
现在,您所要做的就是定义一个接受T
或T const&
作为参数并返回size_t
的自由函数hash_value
。
编辑:将hash
更改为hash_value
,就像在Boost中一样。
每个结构中的公共接口和一个成员函数会很远 更方便。
不会的。而不是std::hash
处理哈希,你现在必须用这个细节来打扰每个类/结构的每个接口。你必须不断地处理"我的某个同事删除了Hashable
"。等。这样也好不过了。情况会更糟。
也许,您可以通过SFINAE的部分专业化来实现它。
相关文章:
- 递归无序映射
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 打印无序映射的第二个元素,即集合
- 由并发无序映射查找线程调用的函数是否安全?
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 将大型对象存储在无序映射中是否效率低下
- 在无序映射的结构化绑定中推导类型
- 使用无序映射进行错误索引
- 将一个向量对放在一个无序映射与一个映射中
- 如何在c++中修改无序映射中的每个值
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 将 [] 索引到无序映射时出现段错误
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 无序映射存储桶的节点大小
- 在无序映射<字符串上使用 find(),向量<string>>与 C++ 中的有序映射花费相同的时间
- 以三个无符号字符为关键字的无序映射
- 无序映射比c++中的映射慢吗