新闻中心
c++怎么自定义哈希函数用于unordered_map_c++自定义hash函数实现技巧
要使用自定义类型作为unordered_map的键,需提供哈希函数和相等比较:1. 可特化std::hash模板,如为Point定义hash;2. 或传入lambda/函数对象作为哈希和比较函数,需指定桶数量;3. 推荐用质数扰动(如0x9e3779b9)与异或组合哈希值以减少冲突;4. 对pair可写通用PairHash结构体。确保相同对象哈希一致,不同对象尽量避免碰撞,提升性能。

在C++中使用unordered_map时,如果键类型是自定义类型(如pair<int int></int>、结构体等),编译器无法自动提供哈希函数,需要手动实现自定义哈希函数。以下是几种常见且实用的实现技巧。
1. 重载std::hash用于自定义类型
要让unordered_map支持自定义类型,可以特化std::hash模板。以二维坐标点Point为例:
struct Point {
int x, y;
bool operator==(const Point& other) const {
return x == other.x && y == other.y;
}
};
namespace std {
template<>
struct hash<Point> {
size_t operator()(const Point& p) const {
// 使用异或和质数扰动减少冲突
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
}
};
}
注意:虽然可以在std命名空间中特化std::hash,但仅限于用户定义类型。不建议对基础类型或标准容器进行特化。
2. 使用lambda或函数对象作为哈希函数参数
如果不希望修改std::hash,可以在声明unordered_map时传入自定义哈希函数和相等比较函数:
auto hash_func = [](const Point& p) {
return hash<int>{}(p.x) ^ (hash<int>{}(p.y) << 1);
};
auto equal_func = [](const Point& a, const Point& b) {
return a.x == b.x && a.y == b.y;
};
unordered_map<Point, string, decltype(hash_func), decltype(equal_func)> my_map(8, hash_func, equal_func);
这里需要指定初始桶数量(如8)并传入函数对象,否则编译器无法推导。
Tome
先进的AI智能PPT制作工具
143
查看详情
3. 推荐的哈希组合技巧
对于多个字段组合哈希值,推荐使用更均匀的方法避免冲突。例如使用质数乘法和异或:
struct PointHash {
size_t operator()(const Point& p) const {
size_t h1 = hash<int>{}(p.x);
size_t h2 = hash<int>{}(p.y);
// 使用FNV-like方法或质数扰动
return h1 ^ (h2 + 0x9e3779b9 + (h1 << 6) +
(h1 >> 2));
}
};
其中0x9e3779b9是黄金比例常数,有助于分散哈希值。
4. 对pair等标准类型的快速处理
虽然std::pair没有默认哈希,可以这样写一个通用哈希组合器:
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);
}
};
unordered_map<pair<int, int>, int, PairHash> coord_map;
基本上就这些。关键是保证相同对象产生相同哈希值,不同对象尽量避免冲突。结合^、位移、质数扰动能有效提升性能。
以上就是c++++怎么自定义哈希函数用于unordered_map_c++自定义hash函数实现技巧的详细内容,更多请关注其它相关文章!
# 推荐使用
# 黑池蛋糕营销推广
# 孝感谷歌seo品牌
# 作业房产网站建设方案
# 玉兰种子网站建设游戏
# 淘宝店铺网站推广
# 辽阳长尾关键词竞价排名
# 企业网站推广策略分析
# 餐饮营销推广论文
# 小说人设关键词优化排名
# 广州品牌SEO网站推广
# 中文网
# 相关文章
# c++
# 多个
# 运算符
# 如何实现
# 如何选择
# 数据结构
# 特化
# 自定义
# red
# 质数
# ai
# 哈希函数
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
J*aScript中正确使用querySelectorAll与复杂CSS选择器
J*a应用集成GitHub CLI与API认证指南
海量存储:机器视觉智能化的核心基石
微博网页版主页入口 微博官方网站免登录访问
Win10双系统截图高效法 截屏快捷键速记【技巧】
将HTML动态表格多行数据保存到Google Sheet的教程
处理动态列数据:J*a ArrayList的正确初始化与字符累加教程
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
动漫岛观看全网网 动漫岛在线正版动漫入口
Pygame教程:解决用户输入与游戏状态更新不同步问题
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
解决Flask中Quill编辑器内容提交失败及TypeError的指南
微信网页版官方入口教程 微信网页版网页版快速登录步骤
HTML长属性值处理:表单action路径优化与代码规范应对
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
J*a 递归快速排序中静态变量的状态管理与陷阱
J*a递归快速排序中静态变量的状态管理与陷阱
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
必由学官网首页入口 必由学教师网页版登录指南
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
UC浏览器网页版登录入口官网 电脑版网址入口
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
Excel Power Pivot如何处理XML数据源 构建高级数据模型
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
必由学在线入口 必由学网页版快速登录入口
微信群消息显示延迟如何解决 微信群消息刷新优化方法
mysql如何设置表访问权限_mysql表访问权限配置
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
夸克AO3官网入口_AO3镜像网站2025推荐
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
深入理解J*a编译器的兼容性选项:从-source到--release
AO3最新镜像入口 Archive of Our Own官方平台访问
Python多线程中正确使用sigwait处理SIGALRM信号
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
2026年CSGO开箱网站推荐 CSGO开箱平台精选
网易大神账号申诉需要多久_网易大神账号申诉流程说明
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤


2025-11-03
浏览次数:次
返回列表
(h1 >> 2));
}
};