首页 > 后端开发 > C++ > 如何在 C 无序容器中扩展自定义类型的标准哈希函数?

如何在 C 无序容器中扩展自定义类型的标准哈希函数?

Barbara Streisand
发布: 2024-12-04 17:46:11
原创
1075 人浏览过

How to Extend the Standard Hash Function for Custom Types in C   Unordered Containers?

为无序容器中的自定义类型扩展标准哈希

为了利用用户定义的类型作为无序容器(例如 std::unordered_set 和 std::)中的键unordered_map,需要实现相等运算符(运算符==)和哈希函子。更方便的方法是专门为自定义类型创建一个默认哈希函数,类似于为标准类型提供的内置哈希函数。

在检查各种资源后,似乎专门针对 std::hash< ;X>::operator() 对于用户定义类型 X 确实是可行的。然而,出现了以下问题:

  1. 是否允许将这样的专门化添加到 std 命名空间?
  2. 哪个版本的 std::hash::operator() ,如果有的话,符合C 11标准吗?
  3. 是否有一种独立于平台的方法来实现这个?

扩展标准命名空间

C 标准明确允许并鼓励向 std 命名空间添加专门化,前提是所涉及的类型之一是用户定义的。因此,第一个问题可以肯定地回答。

C 11 兼容的特化

在 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::operator() 。在 std 命名空间中实现自定义哈希函数需要特定于编译器的实现或使用第三方库。

以上是如何在 C 无序容器中扩展自定义类型的标准哈希函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板