首页 > 后端开发 > C++ > 如何在 C 中为我的用户定义类型专门化'std::hash”?

如何在 C 中为我的用户定义类型专门化'std::hash”?

Mary-Kate Olsen
发布: 2024-12-10 03:19:16
原创
138 人浏览过

How Can I Specialize `std::hash` for My User-Defined Types in C  ?

将 std::hash 专门用于无序容器中的用户定义类型

启用 std::unordered_set 中自定义键类型的使用和 std::unordered_map 一样,必须同时提供相等运算符和哈希函数。这通常涉及定义实现这些运算符的自定义结构或类。不过,对于用户定义的类型,使用默认的哈希函数会更方便,类似于编译器和库提供的内置类型。

根据 C 标准草案 N3242 和 Boost.Unordered ,可以将 std::hash 专门化为自定义类型。这涉及到向 std 命名空间添加专门化:

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); }
}
登录后复制

在此示例中,类型 X 的哈希函数专门用于使用 int 类型的哈希函数,它假设 X 有一个成员变量 id。需要注意的是,哈希函数必须专门针对特定的模板参数类型,并且生成的哈希值必须与该类型的相等运算符一致。

合法性和可移植性:

  • 向 std 添加专业化是否合法?是的,只要涉及的类型之一是用户定义的,向 std 添加专门化是合法的。
  • 哪个版本的 std::hash::operator() 符合 C 11?在 C 11 中专门化 std::hash 的正确方法是定义 struct std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
登录后复制
  • 是否有可移植的方法来做到这一点?上面提供的代码应该可以在支持 C 11 的不同编译器之间移植。

以上是如何在 C 中为我的用户定义类型专门化'std::hash”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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