一个类型需要满足哪些条件,才能使它的自动生成哈希函数具备拷贝构造性?
如果你正在尝试实例化一个 std::unordered_map(或 std::unordered_set),你需要清除类似下面这样的断言(来自GCC的 <bits/hashtable.h>):
static_assert(is_copy_constructible<_Hash>::value,
"hash function must be copy constructible");
但是——一个类型需要满足哪些要求,才能确保它的默认哈希函数 std::hash<_Tp> 是可拷贝构造的?
备注:
- 假设使用C++11或更高版本。
- 我更倾向于给出一个通用答案,但如果需要具体信息,那么就聚焦在随GCC 15.2.0附带的libstdc++上。
- 也有可能为
std::hash<_Tp>实现自己的特化,可能绕过这个问题,但我仍然想知道。
解决方案
C++中没有默认哈希函数
你只能获得对预定义类型(包括算术类型、枚举、指针和标准容器)的 std::hash 种特化。对于所有其他类型,std::hash 默认为禁用——它存在,但不可用(甚至不可拷贝构造)。
你必须为自定义类型提供你自己的 std::hash 的特化(并且你有责任确保它满足所有拷贝/移动的要求)。或者你也可以忽略 std::hash,直接把你自定义的哈希函数提供给 std::unordered_map。
一个标准库中对 std::hash 的可能实现看起来像这样(高度简化,可能缺少若干要求):
namespace std {
// default disabled implementation
template <class T>
class hash
{
hash() = delete;
hash(const hash&) = delete;
hash& operator=(const hash&) = delete;
};
//enabled specialisations
template <>
class hash<char>
{
std::size_t operator()(const char c) const;
};
// ...remaining specialisations provided by the standard library
} // namespace std
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。