尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++ STL 无序容器详解:unordered_map和unordered_set|set/map 与 unordered系列 性能对比与场景选型
目录引言1.unordered_map和unordered_multiset参考文档2.unordered_set类的介绍3.unordered_set和set的使用差异4.unordered_map和map的使用差异5.unordered_multimap和unordered_multiset6.unordered_xxx的哈希相关接口7.unordered系列容器结语引言提示阅读本文前需要掌握setmap的使用————C STL 关联式容器万字详解set、multiset、map、multimap接口用法 易错点 力扣真题实战-CSDN博客C11 标准新增了一类无序容器unordered_set、unordered_map、unordered_multiset、unordered_multimap。 在这之前我们已经学习过 set、map、multiset、multimap这类有序容器底层依托红黑树实现而 unordered 系列容器底层采用哈希表二者接口高度重合很多初学者很容易混淆不知道业务场景该如何选择。本文不会重复讲解容器基础增删查用法重点横向对比有序容器红黑树与无序容器哈希表核心区别、适用场景同时附带性能测试直观体现两者效率差距帮大家理清什么时候选 set/map什么时候优先 unordered_set/unordered_map。话不多说直接进入正文 ————1.unordered_map和unordered_multiset参考文档unordered_set - C Reference这类容器功能和之前讲解的 map、set、multiset、multimap 高度相似基本上掌握 set 的用法就能上手 unordered_set。核心区别体现在底层数据结构unordered 系列容器底层为哈希表map、set 等有序容器底层采用红黑树。头文件——unordered_set2.unordered_set类的介绍unordered_set 的声明如下Key 代表 unordered_set 底层关键字的类型unordered_set 默认要求 Key 能够转换成整型unordered_set 默认需要提供哈希函数将 Key 映射为 size_t 类型哈希值。若类型不满足该要求或是想要自定义哈希规则可以自行实现将 Key 转为整型的仿函数传入第二个模板参数。unordered_set 默认要求 Key 支持相等比较。如果不满足该条件或是需要自定义相等判断逻辑可以自行实现 Key 相等比较的仿函数传入第三个模板参数。unordered_set 底层存储数据的内存是从空间配置器申请的如果需要可以自己实现内存池传给第四个参数。一般情况下我们都不需要传后三个模板参数unordered_set 底层是用哈希桶实现增删查平均效率是O(1)迭代器遍历结果不再有序为了跟 set 区分所以取名 unordered_set。此前我们已经学习过 set 容器的使用set 和 unordered_set 功能高度相似差异主要来自底层结构同时带来性能与使用场景上的区别下文只重点讲解二者的差异部分。3.unordered_set和set的使用差异查看文档可以发现unordered_set 同样支持增、删、查接口使用方式和 set 几乎一致基础用法这里就不再赘述与演示。pairiterator,bool insert ( const value_type val ); size_type erase ( const key_type k ); iterator find ( const key_type k );unordered_set 和 set 的第一个差异对 Key 类型的要求不同。set 要求 Key 支持小于比较unordered_set 要求 Key 能够生成哈希整型值并且支持相等比较。想要理解这两点约束需要后续结合哈希表底层原理学习本质上这是哈希表结构带来的要求。unordered_set 和 set 的第二个差异迭代器类型与遍历特性。set 的迭代器是双向迭代器unordered_set 的迭代器是前向迭代器单向迭代器。set 底层为红黑树二叉搜索树中序遍历结果有序因此 set 遍历表现为【有序 自动去重】unordered_set 底层是哈希表遍历结果【无序 自动去重】。unordered_set 和 set 的第三个差异性能表现。绝大多数场景下 unordered_set 增删查改速度更快。红黑树增删查时间复杂度为 O(logN)哈希表增删查平均时间复杂度为 O(1)性能差异可以参考下方测试代码演示。注哈希表仅为平均 O (1)极端哈希冲突场景有序情况下下性能会退化至 O (N)如果业务必须有序优先选择 set不要盲目使用 unordered_set。#includeunordered_set #includeset #includevector #includeiostream #includecstdlib #includectime using namespace std; int test_set2() { const size_t N 1000000; unordered_setint us; setint s; vectorint v; v.reserve(N); srand((unsigned int)time(0)); // 三种测试数据按需切换 for (size_t i 0; i N; i) { //v.push_back(rand()); // 随机数重复值较多 v.push_back(rand() i); // 随机偏移重复值较少 //v.push_back(i); // 有序无重复数据 } // 插入性能测试 clock_t begin1 clock(); for (auto e : v) { s.insert(e); } clock_t end1 clock(); cout set insert time: end1 - begin1 endl; clock_t begin2 clock(); us.reserve(N); // 提前开辟空间避免多次rehash影响测试 for (auto e : v) { us.insert(e); } clock_t end2 clock(); cout unordered_set insert time: end2 - begin2 endl; // 查找性能测试 int m1 0; clock_t begin3 clock(); for (auto e : v) { auto ret s.find(e); if (ret ! s.end()) { m1; } } clock_t end3 clock(); cout set find time: end3 - begin3 - hit count: m1 endl; int m2 0; clock_t begin4 clock(); for (auto e : v) { auto ret us.find(e); if (ret ! us.end()) { m2; } } clock_t end4 clock(); cout unordered_set find time: end4 - begin4 - hit count: m2 endl; cout set 有效元素个数 s.size() endl; cout unordered_set 有效元素个数 us.size() \n endl; // 删除性能测试 clock_t begin5 clock(); for (auto e : v) { s.erase(e); } clock_t end5 clock(); cout set erase time: end5 - begin5 endl; clock_t begin6 clock(); for (auto e : v) { us.erase(e); } clock_t end6 clock(); cout unordered_set erase time: end6 - begin6 \n endl; return 0; } int main() { test_set2(); return 0; }4.unordered_map和map的使用差异unordered_map 和 map 的区别逻辑与 unordered_set 和 set 的区别完全一致。查看文档可以发现unordered_map 同样支持增、删、查接口使用方式和 map 几乎一致基础用法这里就不再赘述与演示。pairiterator,bool insert ( const value_type val ); size_type erase ( const key_type k ); iterator find ( const key_type k ); mapped_type operator[] ( const key_type k );unordered_map 和 map 的第一个差异对 Key 类型的要求不同。map 要求 Key 支持小于比较unordered_map 要求 Key 能够生成哈希整型值并且支持相等比较。想要理解这两点约束需要后续结合哈希表底层原理学习本质上这是哈希表结构带来的要求。unordered_map 和 map 的第二个差异迭代器类型与遍历特性。map 的迭代器是双向迭代器unordered_map 的迭代器是前向迭代器单向迭代器。map 底层为红黑树二叉搜索树中序遍历结果有序因此map 遍历表现为【有序 Key自动去重】unordered_map 底层是哈希表遍历结果【无序 Key自动去重】。unordered_map 和 map 的第三个差异性能表现。绝大多数场景下 unordered_map 增删查改速度更快。红黑树增删查时间复杂度为 O(logN)哈希表增删查平均时间复杂度为 O(1)性能差异可以参考下方测试代码演示。注哈希表仅为平均 O (1)极端哈希冲突场景有序情况下下性能会退化至 O (N)如果业务必须有序优先选择 map不要盲目使用 unordered_map。5.unordered_multimap和unordered_multisetunordered_multimap /unordered_multiset 与 multimap /multiset 功能高度类似容器允许 Key 重复支持 Key 冗余。unordered_multimap /unordered_multiset 和 multimap /multiset 之间的差异同样分为三点对 Key 类型的要求、迭代器与遍历顺序特性、运行性能。6.unordered_xxx的哈希相关接口buckets和hash policy系列接口分别和哈希桶、负载因子相关。从日常开发使用的角度暂时不需要重点关注等后续学习哈希表底层原理之后再来理解这一组接口就会一目了然。7.unordered系列容器unordered 系列容器不支持 lower_bound、upper_bound 区间查找这是工程上非常关键的区别。set 依靠有序性可以高效区间检索哈希表做不到。重要提醒 unordered容器不要盲目无脑使用1. 需要区间查找、有序打印数据 → 只能选 set/map2. 数据极易产生大量哈希冲突时unordered性能会大幅下滑结语那么C unordered_set和unordered_map使用部分的内容就全部讲解完毕啦希望以上内容对你有所帮助感谢观看若觉得写的还可以可以分享给朋友一起来看哦毕竟一起进步更有动力嘛当然能关注一下就更好啦。
RELATED

相关推荐

Web文件上传漏洞攻防实战:从绕过技巧到防御体系构建

Web文件上传漏洞攻防实战:从绕过技巧到防御体系构建

这次我们来看一个 Web 文件上传漏洞的实战分析与防御专题。对于开发者和安全测试人员来说,文件上传功能是 Web 应用中最常见也最危险的攻击入口之一。一个不经意的疏忽,就可能让服务器沦为攻击者的“后花园”。本文不绕弯子,直接切入核心&…

📅 2026/10/8 18:03:13
Ansys Fluent 2025 安装配置全攻略:从许可证管理到功能验证

Ansys Fluent 2025 安装配置全攻略:从许可证管理到功能验证

如果你正在寻找一份能让你在个人电脑上成功安装并运行 Ansys Fluent 2025 的详细指南,那么这篇文章就是为你准备的。Ansys Fluent 作为业界领先的计算流体动力学(CFD)仿真软件,其强大的功能背后是相对复杂的安装与许可配置过程&am…

📅 2026/10/5 11:30:35
中网B2B战略咨询:B2B赛道全案服务商占比不足5

中网B2B战略咨询:B2B赛道全案服务商占比不足5

B2B市场的快速变化使战略咨询成为企业发展的重要工具。尤其是在全案服务方面、虽然需求旺盛B2B战略咨询公司仍然不足5%。这一现象显露了市场竞争的激烈以及服务体系仍需创新的现状。许多企业意识到、单一的咨询服务无法满足复杂多变的市场需求渴求。但是、由于资源整合与专业能…

📅 2026/9/9 23:41:42
MORE NEWS

更多资讯

📰

2026年中医AI辅助诊疗系统值得关注的品牌对比

2026年中医AI辅助诊疗系统值得关注的品牌对比与选型指南随着大健康产业的数字化进程加速,传统中医馆的经营模式正面临深刻变革。传统的HIS(医院信息系统)主要侧重于 billing 结算和患者建档,虽然在基础信息化方面发挥了作用&#…

📰

HarmonyOS 7+ArkTS:精准碰一碰回执幂等判定与确认门禁【鸿蒙心迹】

碰一碰分享完成后,应用界面收到一条“接收成功”的通知,看起来应该立刻把素材加入列表。这里有一个容易忽略的细节:通知抵达和用户确认接收,不一定是同一件事。设备靠近、页面恢复、通信重试可能让业务适配层交出内容相同的回执。…

📰

朱雀ai检测官网免费入口在哪?查完AI率超标,降AIGC和去AI味工具一并整理

朱雀ai检测官网免费入口在哪?这个问题我这周被问了不下十次,有学弟学妹,也有做公众号的朋友。答案很短:腾讯朱雀的官方检测页是 matrix.tencent.com/ai-detect,打开就能用,不用下载任何东西。 但问的人多&…

📰

埋点排错日志怎么留证据:只记录事件阶段,不记录整包请求

排查“客户端发送成功,报表没有数据”时,最容易临时加一句 console.log(req.body)。它确实能显示请求,却可能把令牌、邮箱、完整 URL、Cookie 或业务属性一起写进排错日志。更稳妥的方法是先定义排错所需的最小证据,再按字段白名单…

📰

朱雀ai率检测小说准不准?网文作者实测AIGC检测,去AI味后AI率从高到低的改法

朱雀ai率检测小说准不准,这是最近几个写网文的朋友轮流来问我的。他们的处境差不多:日更压力大,开头几章或者过渡章节用AI搭了个架子,自己再修一遍,心里总不踏实,就拿去朱雀测一下,结果一片红。…

📰

41-基于STC89C52的避障循迹小车

单片机型号(STC89C52)目录一、摘要二、设计要求三、原理图四、说明书预览五、QA作者简介:电指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作主要内容:人工智能与大数据、单片机…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬