新闻中心
c++如何自定义哈希函数以用于unordered_map _c++ unordered_map自定义哈希技巧
使用自定义类型作为unordered_map键时需提供哈希函数,可通过特化std::hash或传入哈希函数对象实现,推荐结合质数或标准库方法混合哈希值以减少冲突,确保相等对象哈希值相同且分布均匀。

在 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是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要
302
查看详情
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表格中精确实现日期时间排序的指南


2025-11-12
浏览次数:次
返回列表
Point> {
size_t operator()(const Point& p) const {
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
}
};
}