讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ map和unordered_map有什么区别 红黑树与哈希表实现对比

胖芳吖_4475

胖芳吖_4475

发布时间:2025-07-19 12:34:01

|

472人浏览过

|

来源于php中文网

原创

map基于红黑树实现,元素按键顺序存储,插入查找时间复杂度稳定o(log n);unordered_map基于哈希表实现,无序存储,理想情况操作时间复杂度o(1),但受哈希冲突影响可能退化为o(n)。1.底层结构:map使用红黑树保证有序,默认升序排列;unordered_map使用哈希表实现,依赖哈希函数映射键值。2.性能对比:map插入查找效率稳定,适合数据量小或频繁变动场景;unordered_map平均更快,但性能依赖哈希函数质量。3.内存与扩容:map内存分配稳定,无明显扩容行为;unordered_map插入可能触发rehash,导致偶尔延迟尖峰,可通过reserve()预留空间避免。4.自定义类型支持:map需提供比较函数或重载

C++ map和unordered_map有什么区别 红黑树与哈希表实现对比

C++ 中的 map 和 unordered_map 都是用来存储键值对的数据结构,但它们底层实现不同,也导致了在使用场景和性能上有一些明显区别。

C++ map和unordered_map有什么区别 红黑树与哈希表实现对比

1. 底层结构:红黑树 vs 哈希表

map 是基于红黑树实现的,而 unordered_map 则是用哈希表来实现的。

红黑树是一种自平衡的二叉搜索树,这意味着插入、查找、删除的时间复杂度都是 O(log n)。它能保证元素按照键的顺序存储,默认是升序排列。

立即学习“C++免费学习笔记(深入)”;

C++ map和unordered_map有什么区别 红黑树与哈希表实现对比

哈希表则是通过哈希函数将键映射到特定的位置,理想情况下这些操作的时间复杂度可以达到 O(1),但在冲突严重时会退化为 O(n)(比如所有键都哈希到同一个桶中)。

所以如果你需要有序遍历键值对,就选 map;如果更在意访问速度且不需要顺序,那 unordered_map 更合适。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
C++ map和unordered_map有什么区别 红黑树与哈希表实现对比

2. 插入与查找性能对比

  • map 的插入和查找:

    • 插入一个元素需要找到合适位置并调整树结构以维持平衡,时间稳定在 O(log n)。
    • 查找也是通过比较进行,效率稳定,适合数据量不大或变化频繁的情况。
  • unordered_map 的插入和查找:

    • 插入和查找依赖哈希函数,理想情况非常快,O(1),但如果哈希冲突多就会变慢。
    • 所以它的性能受哈希函数质量影响较大,写一个合理的哈希函数很关键。

举个例子:如果你要频繁查找几万个字符串键,unordered_map 可能比 map 快很多;但如果键类型是 int,而且范围集中,简单的哈希可能反而造成大量冲突,这时候 map 反倒更稳。


3. 内存占用与扩容机制

  • map 的内存分配相对稳定,每个节点单独申请空间,不会有明显的“扩容”行为。
  • unordered_map 在插入过程中可能会触发 rehash,也就是重新分配整个哈希表的空间,并把旧数据迁移过去,这会导致某些插入操作耗时突然增加。

所以如果你的应用对响应时间敏感,或者不希望偶尔出现延迟尖峰,那就要注意 unordered_map 的 rehash 行为。可以通过 reserve() 提前预留足够空间来避免这个问题。


4. 是否支持自定义类型直接使用

  • map 要求键类型支持比较操作,通常默认是 运算符。如果是自定义类型,你需要提供一个比较函数或重载 <code>。
  • unordered_map 需要提供一个哈希函数和相等判断函数(==),否则编译会报错。

例如:

struct MyKey {
    int x, y;
};

// 要让 unordered_map 支持这个类型,你得写一个 hash 函数对象
namespace std {
    template<>
    struct hash<MyKey> {
        size_t operator()(const MyKey& k) const {
            return hash<int>()(k.x) ^ hash<int>()(k.y);
        }
    };
}

相比之下,map 对自定义类型的使用更简单些,只要能比较大小就行。


基本上就这些。选择 map 还是 unordered_map,主要看你是更在意顺序、稳定性,还是追求平均更快的查找速度。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3224

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1852

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1838

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2924

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6089

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7674

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn