极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别

news2025/2/26 6:11:10

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

  大家好,我是极智视界,本文来 谈谈 C++ 中 map 和 unordered_map 的区别

  map 和 unordered_map 都可以看做是一种 key-value 的映射关系,unordered_map 可以理解为 无序版的map。unordered_map 是在 C++11 标准才出现的,所以你在代码中如果使用了 unordered_map,则在编译的时候要使用 c++11及以后的标准 进行编译。

  这里直击要点:

  • map 底层是 红黑树,(1) 增、删、改、查都是十分平稳的 log(n) 的复杂度,(2) 基于二叉查找树,数据是有序排列的 (按 key 排序)。在存储上 map 比较占用空间,因为在红黑树中,每一个节点都要额外保存父节点和子节点的连接,因此使得每一个节点都占用较大空间来维护红黑树的性质。
  • unordered_map 底层是 hash表, 其查找的复杂度是常数级别的 O(1),构造的时候如果有冲突时间成本会增加,并且做不到数据有序排列。冲突的解决:当冲突数小于8的时候用链式地址法解决冲突,当冲突大于8的时候使用红黑树解决冲突。

  来把区别用表格展示:

mapunordered_map
平稳的 log(n)比较快,平均 O(1),最坏的情况 O(n)
log(n) + 平衡二叉树使用的时间同上
log(n) + 平衡二叉树使用的时间同上
是否排序有序无序
底层实现红黑树哈希表
适用场景要求排序的场景查找操作频率高的场景

  map 和 unordered_map 在代码使用上十分类似,来看看两者的用法:

int main(){
   map 用法
  map<int, string> _ismap;
  // 增的三种方法
  _ismap.insert(make_pair(0, "kobe"));
  _ismap[1] = "james";
  _ismap.insert(map<int, string>::value_type(2, "curry"));
  // 遍历
  for (auto &iter : _ismap){
    cout << iter.first << " : " << iter.second << endl;
    /*
    * 输出如下 按key递增排序
    * 0 : kobe
    * 1 : james
    * 2 : curry
    */
  }
  // 删除
  map<int, string> ::iterator _mapIter = _ismap.find(0);
  _ismap.erase(_mapIter);    // 删除指定的key
  // _ismap.erase(0);  // 删除key=0的键值对
  // _ismap.erase(std::begin(_ismap));   // 删除第一个键值对
  
  
   unordered_map 用法
  unordered_map<int, string> _isunorderedMap;
  // 增的三种方法
  _isunorderedMap.insert(make_pair(0, "yaoming"));
  _isunorderedMap[1] = "yi";
  _isunorderedMap.insert(unordered_map<int, string>::value_type(2, "zhouqi"));
  // 遍历
  for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++){
    cout << iter->first << " : " << iter->second << endl;
    /*
    * 输出如下 乱序
    * 2 : zhouqi
    * 0 : yaoming
    * 1 : yi
    */
    // 删除
    auto _unorderedIter = _isunorderedMap.find(0);
    _isunorderedMap.erase(_unorderedIter);     // 删除指定的key
    // _unorderedIter.erase(0);    // 删除key=0的键值对
    // _unorderedIter(_unorderedIter.begin());    // 删除第一个键值对
  }
}

  好了,以上分享了 谈谈 C++ 中容器 map 和 unordered_map 的区别,希望我的分享能对你的学习有一点帮助。


 【极智视界】

《极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别》


在这里插入图片描述

搜索关注我的微信公众号【极智视界】,获取我的更多经验分享,让我们用极致+极客的心态来迎接AI !


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 数组

C语言 数组一、一维数组1. 数组的创建方式程序清单1程序清单22. 计算数组的元素的个数3. 数组在内存中的存储方式二、二维数组1. 二维数组的创建方式2. 计算二维数组的行和列3. 二维数组在内存中的存储方式三、数组名的含义总结数组名的应用场景数组名作为函数参数一、一维数组…

22.11.16打卡 mysql学习笔记

马上要考试了, 越到考试越想玩, 烦躁烦躁烦躁, 没学多少, 争取明天把mysql基础篇学完 DCL介绍 2022年11月16日 14:54 DCL主要用来处理数据库有哪些用户可以访问, 每个用户具有什么样的权限 用户管理 2022年11月16日 15:20 所有用户的数据都存放在系统数据库mysql中的user表…

Python是什么?要如何学习?

Python 是荷兰人 Guido van Rossum &#xff08;吉多范罗苏姆&#xff0c;中国程序员称其为“龟叔”&#xff09;在 1990 年初开发的一种解释型编程语言。 Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而…

基于全景相机的视觉里程计算法研究

一、视觉里程计 视觉里程计技术首先建立相机的成像模型&#xff0c;接着通过标定算法计算相机参数&#xff0c;最后建立相邻图像的关联并估计相机运动轨迹。 1.1相机在空间中运动的描述 描述相机在三维空间中的运动状态&#xff0c;即求解相机在空间中不同时刻下的位姿关系。相…

假冒网站引发多重安全风险 | 官方严正声明:切勿在非官方渠道购买或下载 Navicat 软件

Navicat 严正声明 近期&#xff0c;有关于 Navicat 假冒网站的事件&#xff0c;不法分子通过仿制官方网站&#xff0c;诱导用户下载盗版软件。Navicat 官方已正式向国内监管部门举报&#xff0c;提请将该不法网站下架。目前&#xff0c;监管部门已介入调查中。 我司呼吁广大用…

这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破

近年来&#xff0c;凭借高可扩展、高可用等技术特性&#xff0c;分布式数据库正在成为金融行业数字化转型的重要支撑。分布式数据库如何在不同的金融级应用场景下&#xff0c;在确保数据一致性的前提下&#xff0c;同时保障系统的高性能和高可扩展性&#xff0c;是分布式数据库…

C语言之详解内存操作函数

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录前言memcpy模拟实现memmove模拟实现memcmpmemset前言 memcpy叫做内存拷贝&#xff0c;memmove叫做内存移动&#xff0c;memc…

【数据结构】模拟实现双向链表

你必须非常努力&#xff0c;才能显得毫不费劲 目录 1.模拟实现双向链表 1.1 DLinkedList的内部类 1.2 DLinkedList的成员属性 1.3 DLinkedList的成员方法 1.3.1 在链表开头插入一个新结点 1.3.2 在链表结尾插入一个新的结点 1.3.3 计算结点个数 1.3.4 在链表任意位置…

4.构造器,this,修饰符详解

构造器&#xff1a; 构造器也叫构造方法&#xff0c;无返回值。非构造方法必须要有返回类型 主要作用&#xff1a;完成对象的初始化&#xff0c;创造对象时&#xff0c;自动调用构造器初始化对象 即使没有显示地使用static关键字&#xff0c;构造器实际上也是静态方法 JAVA…

HTML---基础入门知识详解

1&#xff1a;标签的概念 在别人写的网页中我们会看到许多文字&#xff0c;图片排版整齐&#xff0c;让人看的赏心悦目&#xff0c;这就是用到了标签&#xff0c;或者说标签就是帮我们实现某种作用的工具&#xff0c;比如制作段落&#xff0c;换行&#xff0c;导入图片&#x…

Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)

操作有问题请点赞关注收藏后评论区留言~~~ 一、导出APK安装包 之前在运行App的时候&#xff0c;都是先由数据线连接手机和电脑&#xff0c;再通过Android Studio的Run菜单把App安装到手机上&#xff0c;这种方式只能在自己手机上调试应用&#xff0c;如果想在别人手机上安装应…

Python画爱心——谁能拒绝用代码敲出会跳动的爱心呢~

还不快把这份浪漫拿走&#xff01;&#xff01;节日就快到来了&#xff0c;给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧&#xff0c;利用Python中的 HTML 制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心&#xff0c;从里到外形成一个立体状&#xff0c;给人视…

FITC标记SPG,FITC-SPG,荧光素标记链球菌G蛋白

产品名称&#xff1a;FITC标记SPG&#xff0c;荧光素标记链球菌G蛋白 英文名称&#xff1a;FITC-SPG 纯度&#xff1a;98% 规格&#xff1a;1mg 5mg 10mg 产地&#xff1a;西安 说明&#xff1a;提供使用说明&#xff0c;核磁图谱&#xff0c;包装&#xff0c;价格&#xff0…

ipv6地址概述——带你了解ipv6与ipv4的不同

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.ipv4与ipv6 1.ipv4与ipv6概述 在开始Pv6的学习以前&#xf…

Tomcat的安装与Maven依赖Servlet的使用

Tomcat的安装与Maven依赖Servlet的使用&#x1f34e;一.Tomcat应用&#x1f352;1.1什么是Tomcat&#x1f352;1.2Tomcat下载安装&#x1f352;1.3 IDEA插件Smart Tomcat&#x1f34e;二.Maven依赖Servlet应用&#x1f352;2.1什么是Servlet&#x1f352;2.2创建Servlet简单实现…

《Java》图书管理系统

这是一个对于Java中知识点的类&#xff0c;抽象类&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;接口等进行的一个简单的代码练习&#xff0c;对于实际的图书管理系统还需要一点的优化 目录 前言 效果展示 功能模块 书架 定义书的类 创建书架 用户 User用…

黑马点评--优惠卷秒杀

黑马点评–优惠卷秒杀 全局ID生成器&#xff1a; 是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一般要满足下列特性&#xff1a; 为了增加ID的安全性&#xff0c;我们可以不直接使用Redis自增的数值&#xff0c;而是拼接一些其它信息&#xff1a; Redis自增ID策…

CentOS7安装MySQL8

文章目录一 前言二、Centos 7 安装 mysql8 步骤&#xff1a;1.下载MySQL官方的 Yum Repository2.安装方法一&#xff1a; 用wget 下载后安装方法二&#xff1a;下载 RMP 软件包将该软件包上传到 Linux 服务器&#xff0c;并安装。3.Navicate 远程连接配置一 前言 最近在自己的…

Python 入门基础

第一个Python程序之打印 Hello World! print("Hello World!")字符串定义的三种方式&#xff0c;type 用了检测数据类型 # 单引号定义法&#xff0c;使用单引号进行包围 name 测试 print(type(name)) # 双引号定义法 name "测试" print(type(name)) # 三…

vue3+ts组件练习(defineExpose defineEmits defineProps)

学习关键语句&#xff1a; vue3ts 组件写法 写在前面 进化到 vue3 ts 的时代&#xff0c;vue的不少语法发生了改变&#xff0c;尤其是选项式 API 变为了组合式 API 和 typescript 的使用使得从 vue2 过来的人需要尽快熟悉新的写法&#xff0c;毕竟大差不差嘛 文章最后有本文…