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使用部分的内容就全部讲解完毕啦希望以上内容对你有所帮助感谢观看若觉得写的还可以可以分享给朋友一起来看哦毕竟一起进步更有动力嘛当然能关注一下就更好啦。

相关新闻

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

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

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

2026/10/21 2:30:04 阅读更多 →
Spring Boot文件上传实战:从基础到分片断点续传

Spring Boot文件上传实战:从基础到分片断点续传

1. 背景与核心概念在Web开发中,文件上传是一个极其常见且基础的功能。无论是用户头像、产品图片、文档附件,还是像“上传一只大狗狗”这样充满生活气息的图片分享,其背后的技术原理都是相通的。然而,这个看似简单的功能&#xff0…

2026/10/20 9:22:13 阅读更多 →
中山大学智能工程学院考研专业课(889/890/884)考纲解析与备考全攻略

中山大学智能工程学院考研专业课(889/890/884)考纲解析与备考全攻略

这次我们来看中山大学智能工程学院27考研的情况。如果你正在关注控制、交通、电子信息这几个方向,特别是对专业课889、890、884的考纲和复习策略感到困惑,这篇文章可以直接收藏。考研信息繁杂,官方文件又常常语焉不详,我们直接切入…

2026/10/18 1:20:48 阅读更多 →

最新新闻

第二章MySQL安装部署(上)

第二章MySQL安装部署(上)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:29:55 阅读更多 →
Autosar+Simulink建模实战:破解模型生成与ECU部署卡点

Autosar+Simulink建模实战:破解模型生成与ECU部署卡点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:29:55 阅读更多 →
ISBN书号查询API——通过 ISBN 查询图书信息:从扫码识书到自建图书系统的完整指南

ISBN书号查询API——通过 ISBN 查询图书信息:从扫码识书到自建图书系统的完整指南

一、图书的"身份证"——ISBN每本正式出版的图书,封底都印有一串以 ISBN 开头的编码。ISBN(International Standard Book Number,国际标准书号),是国际标准化组织(ISO)为每本公开出版的…

2026/10/21 2:29:55 阅读更多 →
从Clawdbot到Moltbot:个人AI代理迁移实战与架构解析

从Clawdbot到Moltbot:个人AI代理迁移实战与架构解析

聊一个最近绕不开的话题:2026年的个人AI代理。如果你一直盯着 Clawdbot 和 Moltbot 这两个代号的演进,大概率会和我有同样的判断——个人 AI 代理的所谓“iPhone 时刻”,这次是真的来了。作为一个从 Clawdbot 一路折腾到 Moltbot 的开发者&am…

2026/10/21 2:29:55 阅读更多 →
RabbitMQ高级

RabbitMQ高级

背景前面我们已经学会了MQ的基本使用,但是我们真正到企业实际开发中,消息业务难免会出现问题,问题的出现主要再这下面三个方面:1.消息没发到消息代理2.消息代理把消息弄丢了3.消费者把消息弄丢了因此我们如果要解决这样的消息可靠…

2026/10/21 2:29:55 阅读更多 →
前英特尔CEO最新判断:绝大部分芯片设计公司将会消失,制造才是唯一的壁垒

前英特尔CEO最新判断:绝大部分芯片设计公司将会消失,制造才是唯一的壁垒

在这一波AI浪潮里,AI算力无疑是最大赢家,英伟达一跃成为全球市值最高的公司之一。 英伟达凭借GPU一跃成为全球市值最高的公司之一,也带动了整个AI芯片创业市场的繁荣。短短几年,大量创业公司涌入,试图从英伟达手中分走…

2026/10/21 2:28:55 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →