unordered_set和unordered_map的使用

       Hello,今天我来为大家介绍一下前几年才刚刚新出的两个容器——unordered_map和unordered_set,这两个容器属于是map系列和set系列中的一种,和map/set不同的是它们的底层,map/set的底层是红黑树,而unordered_map/unordered_set这两个容器的底层则是哈希表,就查找效率而言,unordered_map/unordered_set要更胜一筹。我在这里为大家推荐一个英语的相关网站,希望对大家在学习unordered_map/unordered_set时能够有所帮助。

C/C++相关函数查询官网:Reference - C++ Reference

目录

1 unordered_set类的介绍

  1.1 unordered_set和set的使用差异

2 unordered_map类的介绍

  2.1 unordered_map和map的使用差异

3 unordered_multiset / unordered_multimap

4 unordered_xxx到的哈希相关接口


1 unordered_set类的介绍

       1>.unordered_set的声明如下,Key就是unordered_set底层关键字的类型。

template < class Key, class Hash = hash<Key>, class Pred = equal_to<Key>, class Alloc = allocator<Key>>
class unordered_set;

       2>.unordered_set默认要求Key支持转换为整形,如果不支持或者是想按照自己的需求走的,可以自行实现支持将Key转化成整形的仿函数传给第二个模板参数,也就是Hash。

       3>.unordered_set默认要求Key支持比较相等,如果不支持或想按照自己的要求走的话则可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。

       4>.unordered_set底层存储数据的内存是空间配置器申请的,如果需要的话可以自己实现一个内存池,传给第四个参数。

       5>.一般情况下,我们都不需要传后三个模板参数。

       6>.unordered_set的底层使用哈希桶实现的,增删查平均效率是O(1),迭代器遍历将不再是有序的了,为了跟set区分开来,因此取名为unordered_set。

       7>.前面部分我们已经学习了set容器的使用,set和unordered_set的功能高度相似,只是底层结构不同,有一些性能(效率)和使用上的差异,这里我们只讲它们差异的那部分。

  1.1 unordered_set和set的使用差异

       1>.查看文档我们就会发现unordered_set的增删查操作跟set的增删查操作的使用是一摸一样的,既然如此的话,那么关于使用这里我们就不再做赘述和演示了,若有不会的,则可以参考文档及前面的set和map的使用这一章节,链接如下:

map和set的使用,相信我,超简单的!-CSDN博客文章浏览阅读2.6k次,点赞184次,收藏146次。class set;//T是关键字类型,用来构造二叉搜索树的时候会用到;Compare是一个仿函数,默认set类的底层的那棵二叉搜索树是左边的关键字永远比根小,右边的关键字永远比根大;Alloc是一个内存池,我们现在不需要看这个参数。2>.set类默认要求T支持小于比较,如果不支持或者作者想按自己的需求走的话我们可以自行实现仿函数传给第二个模板参数。3>.set底层存储数据的内存是从空间配置器中申请的,如果需要我们可以自己实现内存池,传给第三个参数。4>.一般情况下,我们都不需要去传后两个模板参数。https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502https://blog.csdn.net/2301_81390458/article/details/143649337?spm=1001.2014.3001.5502

       2>.unordered_set和set的第一个差异是对Key的要求不同,set要求Key支持小于比较,而unordered_set则要求Key支持转成整形并且要支持等于比较,要理解unordered_set地去这两点要求得等到下一章我们结合哈希表的底层实现才能真正地理解,也就是说本质上其实是哈希表地要求。

       3>.unordered_set和set的第二个差异是迭代器地差异,set地iterator是双向迭代器,unordered_set则是单向迭代器,其次由于set的底层是一棵红黑树,而红黑树是二叉搜索树,走中序遍历的话是有序的,所以set迭代器遍历是有序+去重。

       4>.unordered_set和set的第三个差异是性能上的差异,整体而言在大多数的场景下,unordered_set的增删查能更快一些,因为红黑树增删查的效率是O(logN),而哈希表增删查的平均效率是O(1),这样简单地对比下来,unordered_set增删查地性能略胜一筹。

2 unordered_map类的介绍

       unordered_map的介绍和unordered_set差不多,我们这里参考unordered_set的介绍即可,这里就不再讲了。

  2.1 unordered_map和map的使用差异

       1>.查看文档的话我们就会发现unordered_map支持的增删查改和map支持的增删查改的使用是一模一样的,关于使用我们这里就不做过多的讲述和演示了。

       2>.unordered_map和map的第一个差异是对Key的要求不同,map要求Key支持小于比较,而unordered_map要求Key支持转成整形比较且支持等于比较,要理解unordered_map的这两点要求得后续我们结合哈希表底层实现才能真正的理解,也就是说这本质上是哈希表的要求。

       3>.unordered_map和map的第二个差异是迭代器的差异,map的iterator是双向迭代器,unordered_map的iterator是单向迭代器,其次map的底层是红黑树,红黑树是二叉搜索树,走中序遍历是有序的,所以map迭代器遍历时Key有序+去重,而unordered_map的底层时哈希表,迭代器遍历是Key无需+去重。

       4>.unordered_map和map的第三个差异是性能的差异,整体而言大多数场景下,unordered_map的增删查改会更快一些,因为红黑树的增删查改的效率是O(logN),而哈希表的增删查改的平均效率为O(1)。

3 unordered_multiset / unordered_multimap

       unordered_multiset / unordered_multimap跟multiset / multimap的功能完全类似,支持Key冗余。

       unordered_multiset / unordered_multimap跟multiset / multimap的差异也是三个方向的差异,Key的要求的差异,iterator及遍历顺序的差异,性能的差异。

4 unordered_xxx到的哈希相关接口

      Buckets和Hash policy系列的接口分别是哈希桶和负载因子相关的接口,从日常使用的角度来看的话我们是不需要太关注的,后面学习了哈希表层面,我们再回来看这个系列的接口的话,那个时候会一目了然,此时看它不太合适。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日八股】计算机网络篇(一):概述

OSI 的 7 层网络模型&#xff1f; OSI&#xff08;Open Systems Interconnection&#xff0c;开放互联系统&#xff09;是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信模型。 自上而下&#xff0c;OSI 可以被分为七层&#xff0c;分别是&#xff1a;应用层…

DeepSeek 提示词:高效的提示词设计

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

HarmonyOS简

文章为官方教程以及自己的部分理解&#xff0c;用于上下班的查看学习。官方视频教程地址&#xff1a;HarmonyOS应用开发者基础认证-华为开发者学堂 (huawei.com) 应用发开的机遇、挑战和趋势 带来的问题 问题&#xff1a;万物互联&#xff0c;智能设备从几十亿手机拓展到数百…

conda 基本命令

1、查询当前所有的环境 conda env list 2、创建虚拟环境 conda create -n 环境名 [pythonpython版本号] 其中[pythonpython版本号]可以不写 conda create -n test python3.12 我们输入conda env list看到我们的环境创建成功了&#xff0c;但是发现他是创建在我们默认的C盘的…

PythonWeb开发框架—Django之DRF框架的使用详解

1.安装依赖包 pip install djangorestframework 2.配置应用 在settings.py中的INSTALLED_APPS中添加rest_framework应用 3.创建序列化器 序列化器是用来操作models的 第一步&#xff1a;定义models ##models.pyfrom django.db import models# Create your models here.cl…

硬件加速与技术创新双轮驱动:DeepSeek和ChatGPT性能进阶的未来蓝图

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

让子弹飞的DeepSeek火锅诗和《软件方法》

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 我在知乎上面看到了这样的一个问题&#xff1a;DeepSeek写出过哪些惊艳的诗词&#xff1f; 有一位答主讲了他以《让子弹飞》作为素材让DeepSeek写诗的故事&#xff1a;要有风&#xf…

输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE 项目-全局模糊检索

后端数据代码写于下一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;全局跳转页&#xff0c;el-select 实现 —— 后端数据处理代码&#xff0c;抛砖引玉展思路 【效果图】&#xff1a;分组展示选项 >【提供界面操作体验】 【录制效果视频展示】&#xff1a…

【Linux】初识进程概念与 fork 函数的应用

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条冯诺依曼体系与计算机系统架构 进程是操作系统中资源分配和调度的核心单位&#…

【linux】自主shell编写

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.输出命令行02.获取用户命令字符串03.命令行字符串分割04.执行命令05.细节修改检查是否为内建命令 完整代码&#xff1a; 01.输出命令行 完成对一个shell 的编写&#xff0c;首…

小程序高度问题背景scss

不同的机型&#xff0c;他的比例啥的都会不一样&#xff0c;同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

element-ui的组件使用

1. 安装 Element UI&#xff08;在文件夹最上面输入cmd进入dos窗口&#xff0c;然后输入安装指令 npm install element-ui --save&#xff09; 2.在main.js文件全局引入(main.js文件负责 全局注册 )&#xff0c;在该文件注册的所有组件在其他文件都能直接调用&#xff0c;一般…

List的模拟实现(2)

前言 上一节我们讲解了list的基本功能&#xff0c;那么本节我们就结合底层代码来分析list是怎么实现的&#xff0c;那么废话不多说&#xff0c;我们正式进入今天的学习&#xff1a;&#xff09; List的底层结构 我们先来看一下list的底层基本结构&#xff1a; 这里比较奇怪的…

RT-Thread+STM32L475VET6实现红外遥控实验

文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟&#xff0c;并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…

速通HTML

HTML基础 1.快捷键 基于VS Code记录编写过程中常用的快捷键 功能快捷键生成HTML基本骨架!回车保存代码CtrlS在浏览器运行代码AltB注释Ctrl/缩进Tab取消缩进ShiftTab收起侧边栏CtrlB 先保存&#xff0c;再在浏览器运行才能刷新 2.标签 标签作用h1——h6双标签标题标签&#…

WebXR教学 01 基础介绍

什么是WebXR&#xff1f; 定义 XR VR AR Web上使用XR技术的API WebXR 是一组用于在 Web 浏览器中实现虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;应用的技术标准。它由 W3C 的 Immersive Web 工作组开发&#xff0c;旨在提供跨设备的沉浸式体验…

IRI 2016 模型在线版 MATLAB

IRI官网&#xff1a;International Reference Ionosphere IRI-2016在线计算&#xff1a;IRI 2016 | CCMC 官方提供的MATLAB代码需要联网读取IRI网页数据&#xff1a; 下载需要注册账号&#xff0c;没有注册账号的自行注册&#xff0c;下载好后解压是这样的&#xff1a; 下载I…

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…

智慧物业平台(springboot小程序论文源码调试讲解)

第4章 系统设计 用户对着浏览器操作&#xff0c;肯定会出现某些不可预料的问题&#xff0c;但是不代表着系统对于用户在浏览器上的操作不进行处理&#xff0c;所以说&#xff0c;要提前考虑可能会出现的问题。 4.1 系统设计思想 系统设计&#xff0c;肯定要把设计的思想进行统…