新闻中心

C++如何使用unordered_map?(哈希表用法)

2025-12-13
浏览次数:
返回列表
unordered_map 是 C++ 基于哈希表的关联容器,平均时间复杂度 O(1),不保证顺序;需支持 == 和 std::hash;常用 insert/find 避免下标意外插入;自定义类型作 key 需提供哈希与相等函数。

c++如何使用unordered_map?(哈希表用法)

unordered_map 是 C++ 标准库中基于哈希表实现的关联容器,用来高效地存储和查找键值对(key-value),平均时间复杂度为 O(1)。它不保证元素顺序,但插入、查找、删除比 map(红黑树)更快。

基本用法和初始化

需要包含头文件 #include ,并通常使用 std::unordered_map 模板。

  • 键类型(Key)必须支持 == 比较和 std::hash(内置类型如 int、string 都已提供)
  • 值类型(T)可以是任意可复制/移动的类型
  • 常用初始化方式:

std::unordered_map m1; // 空映射
std::unordered_map<:string int> m2 = {{"a", 1}, {"b", 2}}; // 列表初始化
std::unordered_map m3(m1.begin(), m1.end()); // 迭代器构造(需类型兼容)

插入与访问元素

插入有多种写法,注意不同方式的行为差异:

  • m[key] = value:若 key 不存在则插入并默认构造 value;存在则覆盖。适合简单赋值
  • m.insert({key, value}):只在 key 不存在时插入,返回 pair,second 表示是否成功
  • m.try_emplace(key, args...):C++17 引入,仅当 key 不存在时才构造 value(避免不必要的临时对象)

m["hello"] = 3.14; // 插入或更新
auto res = m.insert({"world", 2.71}); // res.second 为 true 表示新插入
m.try_emplace(42, "answer"); // 更高效地插入(尤其 value 构造代价高时)

查找与遍历

查找推荐用 find() 而非下标操作,避免意外插入:

在Android 在Android

本文档主要讲述的是在Android-Studio中导入Vitamio框架;介绍了如何将Vitamio框架以Module的形式添加到自己的项目中使用,这个方法也适合导入其他模块实现步骤。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

在Android 0 查看详情 在Android
  • m.find(key) 返回 iterator,等于 m.end() 表示未找到
  • m.count(key) 返回 0 或 1(不适用于 multimap 场景)
  • 遍历用范围 for 循环,每个元素是 std::pair

auto it = m.find("hello");
if (it != m.end()) {
  std::cout second }

for (const auto& p : m) {
  std::cout " }

性能与自定义哈希/比较

默认情况下,内置类型自动支持哈希;若用自定义类型作 key,需提供哈希函数和相等判断:

  • 定义 std::hash 特化,重载 operator()
  • 或传入自定义哈希仿函数和相等仿函数作为模板参数
  • 注意:哈希函数应尽量均匀分布,避免大量冲突影响性能

struct Person { std::string name; int id; };
struct PersonHash {
  size_t operator()(const Person& p) const {
    return std::hash<:string>{}(p.name) ^ (p.id   }
};
struct PersonEqual {
  bool operator()(const Person& a, const Person& b) const {
    return a.name == b.name && a.id == b.id;
  }
};

std::unordered_map people;

基本上就这些。掌握 insert/find/[] 的区别、避免下标查找引发意外插入、理解哈希定制逻辑,就能稳妥用好 unordered_map。

以上就是C++如何使用unordered_map?(哈希表用法)的详细内容,更多请关注其它相关文章!


# 特化  # 封开网站优化公司  # 网络营销推广运营怎么去获客  # 乡音电影网站建设  # 北京抖音推广营销招聘  # 重庆seo关键词排名哪家好  # 行业关键词排名软件  # 南充网站推广蔚忻hfqjwl下拉  # seo和恶意外链  # 油烟机sem搜索推广营销方案  # 嘉兴seo外链代发  # 文档  # 边缘  # ai  # 自己的  # 遍历  # 键值  # 如何使用  # 不存在  # 游戏开发  # 自定义  # red  # 标准库  # 键值对  # 区别  # c++ 


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


相关推荐: J*a应用集成GitHub CLI与API认证指南  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  ArrayList与LinkedList操作复杂度详解:遍历与修改  C++指针和引用有什么区别_C++内存管理核心概念深度解析  期待已久:小米17 Ultra、小米首款NAS本月登场  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  抖音从哪里进入网页版_抖音官方入口链接  Lar*el Excel导入时生成自定义递增ID的策略与实践  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  Django模型中自动计算可用余额的实现方法  Typer应用中动态命令行参数的解析与处理  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  德邦快递查询平台 德邦快递物流信息查询入口  Tabulator表格中精确实现日期时间排序的指南  J*aScript中管理异步API调用:确保操作顺序与数据一致性  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  Win11怎么开启高性能模式_Windows 11电源计划优化设置  uc浏览器网页版入口 uc浏览器网页版最新网址  蛙漫2台版漫画地址 Manwa2正版网页版链接  PySpark中从现有列右侧提取可变长度字符创建新列的教程  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  如何更改在 Excel 中打开超链接时的默认浏览器  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  Win11怎么开启省电模式_Win11电池节电模式自动开启  C++ map遍历方法大全_C++ map迭代器使用总结  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  Win10双系统截图高效法 截屏快捷键速记【技巧】  Flexbox布局实践:实现粘性导航栏与底部固定页脚  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  押井守高度称赞《辐射4》:玩了八年都停不下来!  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  邮政快递包裹最新位置 邮政快递实时追踪入口  J*aScript打印功能_j*ascript输出控制  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  如何将HTML表格多行数据保存到Google Sheets  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  J*aScript动态修改指定div内所有a标签样式指南  浏览器打开即用 美图秀秀网页版入口  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程 

搜索