新闻中心

c++如何自定义哈希函数以用于unordered_map _c++ unordered_map自定义哈希技巧

2025-11-12
浏览次数:
返回列表
使用自定义类型作为unordered_map键时需提供哈希函数,可通过特化std::hash或传入哈希函数对象实现,推荐结合质数或标准库方法混合哈希值以减少冲突,确保相等对象哈希值相同且分布均匀。

c++如何自定义哈希函数以用于unordered_map _c++ unordered_map自定义哈希技巧

在 C++ 中使用 unordered_map 时,如果键类型不是内置类型(如 int、string),就需要自定义哈希函数。否则编译器会报错:找不到合适的哈希特化版本。

自定义哈希函数的基本方法

要让自定义类型作为 unordered_map 的键,有两种主要方式:

1. 提供 std::hash 的特化版本

如果你的类型是结构体或类,可以在 std:: 命名空间中为它特化 std::hash

#include <unordered_map>
#include <functional>
<p>struct Point {
int x, y;
bool operator==(const Point& other) const {
return x == other.x && y == other.y;
}
};</p><p>namespace std {
template<>
struct hash<Point> {
size_t operator()(const Point& p) const {
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
}
};
}

2. 传入自定义哈希函数对象

不修改 std 命名空间,而是通过模板参数传入哈希函数和相等比较:

Perplexity Perplexity

Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要

Perplexity 302 查看详情 Perplexity

struct PointHash {
    size_t operator()(const Point& p) const {
        return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
    }
};
<p>unordered_map<Point, string, PointHash> myMap;

避免常见哈希冲突技巧

简单的异或可能导致冲突增多,比如 (1,2) 和 (2,1) 可能产生相同哈希值。改进方式:

  • 使用质数乘法混合: (p.x * 31 + p.y)
  • 用标准库组合哈希的方法(推荐):

template<typename T, typename U>
size_t hash_combine(const T& a, const U& b) {
    size_t seed = hash<T>{}(a);
    seed ^= hash<U>{}(b) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
    return seed;
}
<p>// 使用
return hash_combine(p.x, p.y);

处理复杂类型(如 pair、vector)

对于 pair<int></int> 这种常用但无默认哈希的类型,可以这样写:

struct PairHash {
    template <class T1, class T2>
    size_t operator() (const pair<T1,T2>& p) const {
        auto h1 = hash<T1>{}(p.first);
        auto h2 = hash<T2>{}(p.second);
        return h1 ^ (h2 << 1);
    }
};
<p>unordered_map<pair<int, int>, int, PairHash> coordMap;

注意事项与最佳实践

编写自定义哈希时注意以下几点:

  • 保证相等的对象有相同的哈希值(一致性)
  • 尽量减少哈希碰撞,提高性能
  • 不要在 std 中特化非用户定义类型的哈希(违反规则)
  • 若使用指针作键,确保生命周期安全且合理定义哈希逻辑
  • 可结合 boost::hash_combine 思路提升质量

基本上就这些。只要实现好哈希函数和 == 操作符,unordered_map 就能高效工作。关键是哈希分布要均匀,避免退化成链表查询。

以上就是c++++如何自定义哈希函数以用于unordered_map _c++ unordered_map自定义哈希技巧的详细内容,更多请关注其它相关文章!


# 找不到  # 何网站推广孕云速捷选择  # 甜品市场营销推广方案  # 北京专业的网站seo优化推广  # 浙江seo费用多少  # 新郑租房网站建设  # 如何营销公司公众号推广  # 青山湖区seo全网营销  # 网络营销面膜推广  # 东营网站建设情况分析  # 推荐福州seo企业  # 中文网  # 相关文章  # ai  # 就能  # 互联网  # 边缘  # 是一个  # 游戏开发  # 特化  # 自定义  # red  # 标准库  # 质数  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: HTML空白字符处理机制:渲染、DOM与编码实践  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  汽水音乐在线版入口_汽水音乐网页播放手册  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  Django表单验证失败时保留用户输入数据的最佳实践  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  如何在CSS中使用浮动制作导航栏_float实现水平菜单  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  Golang如何使用const iota_Go iota常量计数器讲解  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  内存疯狂猛猛涨价:主板销量直接腰斩!  快手网页版在线登录 快手网页版官网入口快速访问  Golang如何安装Swagger工具_GoSwagger文档生成环境  微信网页版官方快速登录入口 微信网页版网页版账号直达  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  晋江读书网页版在线登录 晋江读书电脑版官网  学习通网页版快速入口 学习通官网网页版直接打开  圆通快递查询实时追踪 圆通物流包裹状态快速查看  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  css绝对定位元素脱离父容器怎么办_确保父元素position非static  理解Python模块与全局变量的作用域管理  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  解决Tabulator日期时间排序问题的专业指南  Pygame教程:解决用户输入与游戏状态更新不同步问题  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  Angular中单选按钮的正确使用与常见陷阱解析  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  J*aScript类型检查_j*ascript代码规范  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  C#中解析不规范的HTML为XML 常见的坑与解决办法  c++ dfs和bfs代码 c++深度广度优先搜索算法  必由学官网入口 必由学教师登录入口  Tabulator表格中精确实现日期时间排序的指南 

搜索