为了利用用户定义的类型作为无序容器(例如 std::unordered_set 和 std::)中的键unordered_map,需要实现相等运算符(运算符==)和哈希函子。更方便的方法是专门为自定义类型创建一个默认哈希函数,类似于为标准类型提供的内置哈希函数。
在检查各种资源后,似乎专门针对 std::hash< ;X>::operator() 对于用户定义类型 X 确实是可行的。然而,出现了以下问题:
C 标准明确允许并鼓励向 std 命名空间添加专门化,前提是所涉及的类型之一是用户定义的。因此,第一个问题可以肯定地回答。
在 C 11 中特化哈希函数的正确且首选的方法是在 std 命名空间中定义一个结构体,如下所示:
namespace std { template <> struct hash<Foo> { size_t operator()(const Foo & x) const { // Implementation of the hash function for type Foo } }; }
此语法确保符合 C 11 标准,并允许为用户定义的自定义哈希函数规范types.
不幸的是,C 中没有独立于平台的方法来专门化 std::hash
以上是如何在 C 无序容器中扩展自定义类型的标准哈希函数?的详细内容。更多信息请关注PHP中文网其他相关文章!