C++哈希表:unordered系列容器详解
本节目标
1.unordered系列关联式容器
2.底层结构
3.模拟实现
4.哈希的应用
5.海量数据处理面试题
unordered系列关联式容器
在c++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到logN,即最差的情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此c++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。
unordered_map
unordered_map的介绍
无序映射(unordered_map)是一种关联式容器,用于存储由键值(key)和映射值(mapped value)组合而成的元素, 并支持基于键的快速元素检索。
在unordered_map中: - 键值通常用于唯一标识元素 - 映射值是与该键关联的内容对象 - 键和映射值的类型可以不同 其内部实现特点:
1. 元素不会按照键值或映射值的顺序排列
2. 基于哈希值组织到桶(buckets)中
3. 通过键值直接访问元素的平均时间复杂度为O(1)
性能特性:
- 无序映射在通过键访问单个元素时比有序映射(map)更快
- 但在迭代访问元素子集时效率通常较低
接口特性:
- 支持直接访问操作符(operator[]),可通过键值直接访问映射值
- 容器提供的迭代器至少为前向迭代器(forward iterators)
unordered_map的接口使用说明
这些是别名,也就是typedef过的,为了方便后续理解,可以自行把常见和常用的了解一下
构造函数
empty (1)
explicit unordered_map ( size_type n = /* see below */, const hasher& hf = hasher(), const key_equal& eql = key_equal(), const allocator_type& alloc = allocator_type() );
explicit unordered_map ( const allocator_type& alloc );
range (2)
template <class InputIterator>
unordered_map ( InputIterator first, InputIterator last, size_type n = /* see below */,const hasher& hf = hasher(),const key_equal& eql = key_equal(), const allocator_type& alloc = allocator_type() );
copy (3)
unordered_map ( const unordered_map& ump );
unordered_map ( const unordered_map& ump, const allocator_type& alloc );
move (4)
unordered_map ( unordered_map&& ump );
unordered_map ( unordered_map&& ump, const allocator_type& alloc );
initializer list (5)
unordered_map ( initializer_list<value_type> il, size_type n = /* see below */, const hasher& hf = hasher(), const key_equal& eql = key_equal(), const allocator_type& alloc = allocator_type() );
总结:第一个就是构造一个空的非排序map
第四个就是拷贝构造
第五个是迭代器构造
基本上知道第一个和第四个就行了,其他可以自行了解
capacity函数
iterator函数
元素访问函数
只要知道[]就可以了
modifier函数
学习insert erase clear swap即可
桶操作(具体可以等学习完hash后在了解)
unordered_set
unordered_set的介绍和使用这里就不多加说明了,就是和set差不多,就是底层结构不一样,我们重点学习底层结构
map/set和unordered_map/unordered_set有什么区别和联系?
1.都可以实现key和key-value的搜索场景,并且功能和使用基本一样
2.map/set的底层是用红黑树实现的,遍历出来是有序的,增删查改的时间复杂度为logN
3.unordered_map和unordered_set的底层是用哈希表实现的,遍历出来的是无序的,增删查改的时间复杂度为O(1)
4.map和set是双向迭代器,unordered_map和unordered_set是单向的(仅支持++)
底层结构
请移步我的数据结构篇章中关于哈希表的讲解(包括海量数据的处理都在那一篇章讲解)
相关文章:

C++哈希表:unordered系列容器详解
本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到logN,即最差的情况下需要比较红…...
vue-13(延迟加载路由)
用于性能优化的延迟加载路由 延迟加载路由是优化 Vue.js 应用程序性能的关键技术,尤其是那些具有大量路由的应用程序。通过仅在实际需要时加载路由组件,您可以显著减少应用程序的初始加载时间,从而获得更好的用户体验。这对于网络连接速度较…...
pom.xml 文件中配置你项目中的外部 jar 包打包方式
使用 system 作用域(不推荐,但简单直接) <dependency><groupId>com.test</groupId> <!-- 可自定义,建议与项目相关 --><artifactId>open-sdk</artifactId> <!-- 可自定义,建议…...

WordPress通过简码插入bilibili视频
发布于:Eucalyptus-Blog 一、前言 B站是国内非常受欢迎的视频分享平台,上面不仅内容丰富,而且很多视频制作精良、趣味十足。很多人,比如我,就喜欢将B站的视频通过 iframe 嵌入到自己的网页中,但这段代码又…...

ZLG ZCANPro,ECU刷新,bug分享
文章目录 摘要 📋问题的起因bug分享 ✨思考&反思 🤔摘要 📋 ZCANPro想必大家都不陌生,买ZLG的CAN卡,必须要用的上位机软件。在汽车行业中,有ECU软件升级的需求,通常都通过UDS协议实现程序的更新,满足UDS升级的上位机要么自己开发,要么用CANoe或者VFlash,最近…...

黑马k8s(十七)
一:高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc,观察状态: 4.高级存储-pc和pvc的生命周期 二:配置存储 1.配置存储-ConfigMap 2.配…...

掌握HttpClient技术:从基础到实战(Apache)
目录 前言 一、Apache HttpClient简介 二、HttpClient基础使用 1. 添加依赖 2. 创建HttpClient实例 3. 发送GET请求 4. 发送POST请求 三、HttpClient高级配置与实战案例 1. 连接池优化 2. 超时与重试配置 3. 文件上传(Multipart) 总结 前言 …...
KEYSIGHT N9320B是德科技N9320B频谱分析仪
KEYSIGHT N9320B是德科技N9320B频谱分析仪 附加功能: 频率范围:9 kHz 至 3 GHz 分辨率带宽:10 Hz 至 1 MHz DANL:-130 dBm,-148 dBm,带可选前置放大器 整体幅度精度:<1.5 dB 最小非零扫…...
EXSI通过笔记本wifi上外网配置
我有一台服务器安装了EXSI,服务器IP地址配置的是192.168.137.2,在EXSI中创建了一个linux虚拟机,ip地址是192.168.137.22。现在我有一个windows笔记本,使用家庭的wife上外网,wife给自动分配了一个192.168.0.106地址&…...
Java异常处理的全面指南
Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…...

sql知识梳理(超全,超详细,自用)
目录 通识 查询的基本语法 数据库(database)操作 表(table)的操作 表中列的操作 索引操作 表中行的操作 insert into语句 update语句 删除语句 select语句 表与表之间的关系 连接查询 子查询 视图 数据备份与还原 …...

[ Qt ] | QPushButton常见用法
目录 绑定键盘快捷键 前面已经说了很多用法了,下面主要说说绑定键盘,设置Icon图片。 绑定键盘快捷键 实现四个按钮,可以使用wsad来控制另一个按钮的上下左右的移动。 #include "widget.h" #include "ui_widget.h"Wid…...
WEB3——为什么做NFT铸造平台?
相必之前看过我的入门项目推荐关于简易NFT铸造平台的文章。会有一些疑惑 WEB3—— 简易NFT铸造平台(ERC-721)-入门项目推荐-CSDN博客 WEB3,我直接在https://nft.storage网站里上传图片不行吗,必须用合约铸造NFT? 我做…...

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!
介绍 3DP Chip 是一款免费的驱动程序更新工具,可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用:用户界面简洁明了,操作方便,…...

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库
机器学习入门核心:数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计(MLE)7. 线性代数 二、Python科学计算库精要1. NumPy:数值计算核心2. SciPy&…...

上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略
作者:Qiming Liu 1 ^{1} 1, Guangzhan Wang 2 ^{2} 2, Zhe Liu 3 , 4 ^{3,4} 3,4 and Hesheng Wang 1 , 3 , 5 , 6 ^{1,3,5,6} 1,3,5,6单位: 1 ^{1} 1上海交通大学自动化系, 2 ^{2} 2上海交通大学软件学院, 3 ^{3} 3上海交通大学教…...

【C++并发编程01】初识C++并发编程
1、并发是什么 并发是指两个或更多独立的活动同时发生,现实生活中常见的并发场景如边吃饭边看手机。 1.1、计算机中的并发: 计算机领域的并发是指在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。 我们在电脑上能够边听音乐边和…...

Mysql库的操作和表的操作
Mysql库和表的操作 库的操作1.查看数据库列表2.创建数据库3.使用数据库4.查看当前在那个数据库中5.显示数据库的创建语句6.修改数据库7.删除数据库8.备份和恢复数据库9.查看数据的连接情况(简单来说就是查看有多少人使用你的数据库) 表的操作1.创建表2.查看表结构3.修改表本身(…...

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)
针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…...
word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)
文章目录 prompt prompt [格式要求] - 字体:中文宋体小四;英文Times New Roman 12pt;标题黑体 - 行距:1.5倍(段前段后0行) - 边距:A4默认(上下2.54cm,左右3.17cm&…...
Ubuntu 桌面版忘记账户密码的重置方法
如果你忘记了 Ubuntu 桌面版的用户密码,可以通过进入恢复模式(Recovery Mode)来重置密码。以下是详细步骤: 一、进入 GRUB 引导菜单 重启计算机:点击关机按钮,选择重启。在启动时按住 Shift 键࿱…...

抖音商城抓包 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 抓包展示 总结 1.出于安全考虑,本章未…...
[SC]sc_signal_rv的用法和sc_signal相比有什么优势?
sc_signal_rv的用法和sc_signal相比有什么优势? 在 SystemC 中,sc_signal<T> 是最常用的单驱动(single‐driver)信号通道;而 sc_signal_rv<W>(“rv” = resolved vector)则是一种多驱动、带总线(tri-state)分辨功能的信号。下面分几点来说明它们的…...
掌握 FreeRTOS:打造高效嵌入式系统的第一步
实例对比说明: 手机: 点击相机 -> 操作系统 -> 打开摄像头 无操作系统: 相机 -> 打开摄像头也能实现,但方式死板、不支持第三方应用 MCU 对比说明: 裸机开发: MCU -> 直接控制硬件 使用操作系统: MCU -> 操作系统 -> 硬…...

性能优化 - 案例篇:数据一致性
文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段:数据预加载5.2 …...

Spring框架学习day6--事务管理
Spring事务管理 Spring事务管理是在AOP的基础上,当我们的方法完全执行成功后,再提交事务,如果方法中有异常,就不提交事务 Spring中的事务管理有两种方式: 1.编程式事务 需要我们在业务代码中手动提交 2.声明式…...

免费酒店管理系统+餐饮系统+小程序点餐——仙盟创梦IDE
酒店系统主屏幕 房间管理 酒店管理系统的房间管理,可实现对酒店所有房间的实时掌控。它能清晰显示房间状态,如已预订、已入住、空闲等,便于高效安排入住与退房,合理分配资源,提升服务效率,保障酒店运营有条…...

Git企业级项目管理实战
目录 1. 准备工作 2. 添加成员 2.1 添加企业成员 2.2 添加项目成员 2.3 添加仓库开发人员 3. 开发场景 - 基于git flow模型的实践 3.1 新需求加入 3.2 修复测试环境 Bug 3.3 修改预发布环境Bug 3.4 修改正式环境 Bug 3.5 紧急修复正式环境 Bug 4. 拓展阅读 4.1 其…...

【实例】事业单位学习平台自动化操作
目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…...

4.8.3 利用SparkSQL统计每日新增用户
在本次实战中,我们的任务是利用Spark SQL统计每日新增用户数。首先,我们准备了用户访问历史数据,并将其上传至HDFS。然后,通过Spark的交互式编程环境,我们读取了用户文件并将其转换为结构化的DataFrame。接着ÿ…...