C++:map和unordered_map, set和unordered_set的对比

2023-10-27

一、map

map内部实现了一个 红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树), 红黑树具有自动排序的功能,因此map内部的所有元素都是有序的。map中的元素是按照二叉搜索树(特点是 左 < 根 < 右 )存储的,使用中序遍历可将键值按照从小到大遍历出来。

优点:有序性,这是map结构最大的优点,内部实现的红黑树使得map的很多操作在O(logN)的时间复杂度下就可以实现,因此效率非常的高。

缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率(低于unorder_map),但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间(但占用的内存比unorder_map低)

适用:对于数据存储有顺序要求的问题,常用map

map是基于RBT(红黑树)的,因此元素是有序存储的(默认按  的 升序排列)。


二、unordered_map

unordered_map内部实现了一个 哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此, 其元素的排列顺序是无序的。

优点: 因为内部实现了哈希表,因此其查找速度非常的快(运行效率快于map)
缺点: 哈希表的建立比较耗费时间(unorder_map占用的内存比map要高)
适用:对于查找问题,unordered_map会更加高效一些

unordered_map 是基于hash表的,因此元素是无序存储的。


三、set

set实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

set 是基于RBT的,因此元素是顺序存储的(默认按 键值 升序排列)。


四、unordered_set

unordered_set的内部实现了一个 哈希表,因此, 其元素的排列顺序是无序的

unordered_set 是基于hash表的,因此元素是无序存储的( 不按键值 升序排列)。


五、总结 

数据结构 map unordered_map set unordered_set
底层实现 红黑树 hash表 红黑树 hash表
元素格式 key+value key+value key key
存储规律 键升序 无序 键升序 无序
元素重复 键不可,值可 键不可,值可 不可重复 不可重复
头文件 #include<map> #include<unordered_map> #include<set> #include<unordered_set>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:map和unordered_map, set和unordered_set的对比 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要

随机推荐

  • 苹果开发者ADP协议第3.2(f)节违反

    相信很多开发者都遇到过 ADP协议第3 2 f 节违反 导致账号被封 遇到这种情况基本没戏 不用再联系苹果了 基本没戏 以下是被封的邮件信息 Hello xxx This letter serves as notice of termina
  • DSP CCS 12.00运用, 产生正弦波的图像 芯片:F28335

    1 首先建立新的项目 工程 2 参数选择 3 设置数据 保证与芯片得连接 4 整理思路 信号频率 1000 HZ 采样频率 20000 HZ 采样点数 128 5 代码 头文件的定义 include stdio h include math
  • vue-aplayer在手机移动端的时候默认没有总时长,点击播放才显示总时长问题

    前言 在移动段使用vue aplayer这款音频播放组件的时候 发现他默认的时候看不到总时长 只有点击播放才能看到 我的数据是从后台直接拿来的 观察官网没有这个问题 既然出现问题就得解决问题 这里分享下我的解决办法 解决办法一 尝试过但是不
  • C语言中 char str[] 与 char *str 的关系

    首先 我们得明确 在C语言中 没有真正的字符串类型 所以 就诞生了 字符串数组 这么个类型 于是 当我们想申明一个字符串变量时 大体上有下面两种方法 char str hello char p hello str 它定义的是一个字符串数组变
  • golang-- 字典树

    一 前言 看了百度团队在 infoq 上发表的一篇 如何在秒级完成词表匹配 https xie infoq cn article 97b2df7e41456335627ce4cd4 的文章 文章业务背景介绍的很清楚 里面有提到字典树 看到结
  • __attribute__((aligned(n)))和__attribute__((packed))

    绪 attribute 是GUN C中极具特设的一大机制 可以用来设置 函数属性 Function Attribute 变量属性 Variable Attribute 类型属性 Type Attribute 这里我们主要阐述用 attrib
  • Win10禁用驱动签名,进入测试模式

    以系统管理员权限打开CMD控制台 执行 bcdedit exe set TESTSIGNING ON 点击 开始 gt 设置 打开 windows设置 对话框 在搜索框中输入 更改高级启动选项 点击 高级启动 下面的 立即重新启动 按钮 然
  • python中class类的可迭代实现以及迭代函数

    当定义一个普通的类时 指向类的实例默认情况下是不可迭代的 如下 In 3 from collections import Iterable In 4 class Fruit object def init self self item li
  • 【C语言】typedef struct和直接struct的区别

    例一 struct char a int b x 这里 创建了一个变量 包含两个成员 一个字符 一个整数 例二 struct STUDENT char name int age 这里 创建了一个标签 tag 为成员列表提供了一个STUDEN
  • TSNE—聚类结果可视化

    文章目录 一 TSNE参数解析 二 案例 TSNE的定位是高维数据可视化 对于聚类来说 输入的特征维数是高维的 大于三维 一般难以直接以原特征对聚类结果进行展示 而TSNE提供了一种有效的数据降维模式 是一种非线性降维算法 让我们可以在2维
  • 机器学习之二分类模型评价指标

    机器学习之二分类模型评价指标 一 二分类模型衡量指标 1 1 混淆矩阵 Confusion matrix 1 1 1 原理 1 1 2 实现 1 2 精确度 Accuracy 1 2 1 原理 1 2 2 实现 1 3 准确率 Precis
  • c++中标识符常量表示方法

    什么是标识符常量 标识符常量又称符号常量 它是指用一个符号来代替一个数值 我们为什么要用它 对于一个在程序中常常出现的数值 我们可以定义一个符号来表示它 好处是修改方便 代码可读性高 例如 在程序中用到了常数 pi 如果每次都写 3 141
  • Java 发送http GET/POST请求

    摘要 HttpURLConnection是一种多用途 轻量极的HTTP客户端 使用它来进行HTTP操作可以适用于大多数的应用程序 HttpURLConnection是Java的标准类 它继承自URLConnection 可用于向指定网站发送
  • 获取逻辑回归LogisticRegression模型的重要特征

    获取逻辑回归LogisticRegression模型的重要特征 模型训练之后 想要得到比较重要的特征 可以通过python的sklearn包来实现 python实现代码如下所示 LogisticRegression py coding ut
  • XeLaTex 下运行 InkScape 帮助文档的 includesvg 命令出现 undefined control sequence 错误

    解决办法 添加下图的第 5 行 引入 pdftexcmds 包即可 2022年5月5日补充 使用 xelatex 来编译后 发现不能自动更新矢量图 才知道是什么原因 第8和第9行的 pdffilemoddate 不能用 具体为什么我也不知道
  • Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

    环境部署 官网下载Jmeter http jmeter apache org 下载最新版本的 JMeter 解压文件到任意目录 安装JDK 配置Java环境 1 下载 注意选择操作系统对应的位数32 64 官网 http www oracl
  • Spring Boot入门系列(二十一)如何优雅的设计 Restful API 接口版本号,实现 API 版本控制!...

    前面介绍了Spring Boot 如何快速实现Restful api 接口 并以人员信息为例 设计了一套操作人员信息的接口 不清楚的可以看之前的文章 https www cnblogs com zhangweizhong category
  • 服务器主板能配固态硬盘吗,主板没有M.2接口能使用M.2固态硬盘吗【使用方法】...

    固态硬盘与主板接口都是必须想配对的 那么主板没有M 2接口可以使用M 2固态硬盘吗 主板都没有M 2接口是不可以安装M 2固态硬盘的 接口都没怎么装 这还用吗 主板没有M 2接口还可以使用M 2固态硬盘吗 其实对于一些入门主板或者一些较旧的
  • 【Twinkle】软件工程师的职业路线

    社区中并不缺少有关软件工程师职业发展的文章 甚至可以说是泛滥 很多人都能在这个话题上说两句 三五年工作经验的编程老鸟也好 架构师也好 技术 VP 也好 CTO 也好 都有各自的看法与实践经验 没有哪一套方法是适用于所有人的 这一套软件工程师
  • C++:map和unordered_map, set和unordered_set的对比

    一 map map内部实现了一个 红黑树 红黑树是非严格平衡二叉搜索树 而AVL是严格平衡二叉搜索树 红黑树具有自动排序的功能 因此map内部的所有元素都是有序的 map中的元素是按照二叉搜索树 特点是 左 lt 根 lt 右 存储的 使用