当前位置: 首页 > news >正文

C++之unordered_map/set的使用

前面我们已经学习了STL中底层为红黑树结构的一系列关联式容器——set/multiset 和 map/multimap(C++98).


unordered系列关联式容器

C++98中, STL提供了底层为红黑树结构的一系列关联式容器, 在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次, 当树中的节点非常多时, 查询效率也不理想.

最好的查询是, 进行很少的比较次数就能够将元素找到, 因此在C++11中, STL又提供了4个unordered系列的关联式容器, 这四个容器与红黑树结构的关联式容器使用方式基本类似, 只是其底层结构不同.


map,set系列容器和unordered_map,unordered_set系列容器的区别 

1.它们的底层结构是不一样的:

set/multiset 和 map/multimap它们的底层结构是红黑树, 而unordered系列的——unordered_map/unordered_multimap, unordered_set/unordered_multiset它们的底层是哈希表.

unordered系列中, 带multi的和不带multi的区别也是允许键值重复出现和不允许重复出现的问题.

2.从名字上我们其实就能得出它们的第二个区别:

unordered是无序的意思, 所以map和set我们用迭代器遍历, 得到的是有序的序列, unordered系列去遍历的话, 得到的是无序的, 单从使用上来说最大的区别就是有没有序的问题.

3.map和set系列它们的迭代器是双向迭代器, 而unordered系列它们的迭代器是单向迭代器.

4. unorder _ map 容器通过键访问单个元素的速度比 map 容器快, 尽管它们通过元素的子集进行范围迭代的效率通常较低.(和底层实现有关)


 unordered_map和unordered_set的使用

单从使用来说, 这和set/multiset 和 map/multimap的使用用法基本一致, 常用的接口都差不多.

unordered_map的接口:

unordered_map的构造:

函数声明功能介绍
unordered_map构造不同格式的unordered_map对象

 unordered_map的容量:

函数声明功能介绍
bool empty() const检测unordered_map是否为空
size_t size() const获取unordered_map的有效元素个数

unordered_map的迭代器:

函数声明功能介绍
begin返回unordered_map第一个元素的迭代器
end返回unordered_map最后一个元素下一个位置的迭代器
cbegin返回unordered_map第一个元素的const迭代器
cend返回unordered_map最后一个元素下一个位置的const迭代器

unordered_map的元素访问:

函数声明功能介绍
operator[]返回与key对应的value

注意: 该函数中实际调用哈希桶的插入操作, 用参数key与V()构造一个默认值往底层哈希桶
中插入, 如果key不在哈希桶中, 插入成功, 返回V(); 插入失败, 说明key已经在哈希桶中,
将key对应的value返回

unordered_map的查询:

函数声明功能介绍
iterator find(const K& key)返回key在哈希桶中的位置
size_t count(const K& key)返回哈希桶中关键码为key的键值对的个数

注意: unordered_map中key是不能重复的,因此count函数的返回值最大为1 

unordered_map的修改:

函数声明功能介绍
insert向容器中插入键值对
erase删除容器中的键值对
void clear()清空容器中有效元素个数
void swap(unordered_map&)交换两个容器中的元素

unordered_map的桶操作:

函数声明功能介绍
size_t bucket_count()const返回哈希桶中桶的总个数
size_t bucket_size(size_t n)const返回n号桶中有效元素的总个数
size_t bucket(const K& key)返回元素key所在的桶号

它的迭代器没有rbegin、rend, 因为它的迭代器是单向的,不支持反向遍历。


 unordered_set的接口:

 接口也都差不多,只是set系列的没有[]和at接口.

#include<set>
#include<unordered_set>
#include<iostream>
using namespace std;int main()
{set<int> s1;unordered_set<int> s2;s1.insert(1);s1.insert(5);s1.insert(4);s1.insert(3);s1.insert(8);for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)cout << *it << " ";
//cout << endl;
//s2.insert(1);s2.insert(5);s2.insert(4);s2.insert(3);s2.insert(8);for (unordered_set<int>::iterator it = s2.begin(); it != s2.end(); it++)cout << *it << " ";return 0;
}

 

可以看到set按迭代器访问是有序的, unordered_set按迭代器访问是按照插入顺序访问的, unordered_map也是一样.


set与unordered_set性能对比 

void test2()
{srand(time(nullptr));size_t N = 1000000;unordered_set<int> us;set<int> s;vector<int> v;v.reserve(N);for (size_t i = 0; i < N; i++){v.push_back(rand()+i);//减少重复值}size_t begin1 = clock();for (auto& e : v)s.insert(e);size_t end1= clock();cout << "set insert:" << end1 - begin1 << endl;size_t begin2 = clock();for (auto& e : v)us.insert(e);size_t end2 = clock();cout << "unordered_set insert:" << end2 - begin2 << endl;size_t begin3 = clock();for (auto& e : v)s.find(e);size_t end3 = clock();cout << "set find:" << end3- begin3 << endl;size_t begin4 = clock();for (auto& e : v)us.find(e);size_t end4 = clock();cout << "unordered_set find:" << end4 - begin4 << endl;size_t begin5 = clock();for (auto& e : v)s.erase(e);size_t end5 = clock();cout << "set erase:" << end5 - begin5 << endl;size_t begin6 = clock();for (auto& e : v)us.erase(e);size_t end6 = clock();cout << "unordered_set erase:" << end6 - begin6 << endl;}

所以, 综合而言, unordered系列的效率是比较高的, 尤其是find的效率.


OJ例题

349. 两个数组的交集 - 力扣(LeetCode) 

map和set的例题-CSDN博客

之前有用set的解法, 排序加去重可以解决, 现在可以用unordered_set, unordered_set虽然不能排序, 但是也是可以去重的, 首先我们先对两个数组进行去重, 然后, 我们遍历其中一个数组, 遍历的同时去依次判断当前元素在不在另一个数组中, 如果在就是交集。


 350. 两个数组的交集 II - 力扣(LeetCode)

返回结果中每个元素出现的次数, 应与元素在两个数组中都出现的次数一致(如果在两数组中出现次数不一致,则考虑取较小值), 但是它没有要去输出结果中每个元素是唯一的。 


 

统计次数, 判断有没有次数大于1的就行了:


 884. 两句话中的不常见单词 - 力扣(LeetCode)

这道题其实可以求转化成两个字符串合并后, 只出现一次的单词.

 

相关文章:

C++之unordered_map/set的使用

前面我们已经学习了STL中底层为红黑树结构的一系列关联式容器——set/multiset 和 map/multimap(C98). unordered系列关联式容器 在C98中, STL提供了底层为红黑树结构的一系列关联式容器, 在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次, 当树中的节点非常多时,…...

docker打包chatpdf(自写)

docker打包上传 docker build -t kitelff/chatpdf:v0.1 .##修改镜像名字 docker tag c2c1a0eb4e08 kitelff/chatpdf:v0.1## push docker push kitelff/chatpdf:v0.1上传文件&#xff0c;测试效果...

shell基础

一.Shell脚本编程概述 1.基本概念 将要执行的命令按顺序保存到一个文本文件&#xff1b; 给该文件可执行权限&#xff1b; 可结合各种Shell控制语句以完成更复杂的操作。 2.作用 Linux系统中的Shell是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#x…...

力扣1038. 从二叉搜索树到更大和树(java,树的中序遍历解法)

Problem: 1038. 从二叉搜索树到更大和树 文章目录 题目描述思路解题方法复杂度Code 题目描述 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff…...

使用正则表达式来判断一个字符串只是否包含数字

使用正则表达式来判断一个字符串只是否包含数字 1、第一种 import java.util.regex.Pattern;public class Main {public static void main(String[] args) {String inputString "12345";if (containsOnlyDigits(inputString)) {System.out.println("字符串只…...

C#Wpf关于日志的相关功能扩展

目录 一、日志Sink(接收器) 二、Trace追踪实现日志 三、日志滚动 一、日志Sink(接收器) 安装NuGet包&#xff1a;Serilog Sink有很多种&#xff0c;这里介绍两种&#xff1a; Console接收器&#xff08;安装Serilog.Sinks.Console&#xff09;; File接收器&#xff08;安装…...

亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight

目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…...

MySQL安全性:用户认证、防范SQL注入和SSL/TLS配置详解

MySQL作为广泛使用的关系型数据库管理系统&#xff0c;安全性至关重要。在本篇技术博客中&#xff0c;我们将深入探讨MySQL的用户认证方式、防范SQL注入攻击的方法以及SSL/TLS加密的配置。 1. MySQL用户认证方式 MySQL支持多种用户认证方式&#xff0c;其中两种常见方式是cac…...

EMG肌肉信号处理合集 (一)

本文归纳了常见的肌肉信号预处理流程&#xff0c;方便EMG信号的后续分析。使用pyemgpipeline库 来进行信号的处理。文中使用了 UC Irvine 数据库的下肢数据。 目录 1 使用wrappers 定义数据类&#xff0c;来进行后续的操作 2 肌电信号DC偏置去除 3 带通滤波器处理 4 对肌电…...

学自动化测试?我劝你还是算了吧。。。

本人7年测试经验&#xff0c;在学测试之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说&#xff1a;自学软件测试&#xff0c;一般人我还是劝你算了吧&#xff1f;因为我就是那个一般人&#xff01; 软件测试基础真的很简单&…...

第一百七十八回 介绍一个三方包组件:SlideSwitch

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何创建垂直方向的Switch"相关的内容&#xff0c;本章回中将 介绍SlideSwitch组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…...

Windows任务管理器内存性能界面各个参数含义

任务管理器的内存性能界面提供了一些关键参数&#xff0c;这些参数可以帮助你了解系统中内存的使用情况。以下是一些常见的参数及其含义&#xff1a; 已提交&#xff08;Committed&#xff09;&#xff1a; 表示已分配的物理内存和虚拟内存的总和。已提交的内存包括当前正在使…...

深度学习人脸表情识别算法 - opencv python 机器视觉 计算机竞赛

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…...

全职RISC-V芯片D1开发板使用adb串口COM连接设备和文件上传下载

将两个USB端口都连接到工作电脑 推荐使用ADB工具访问开发板&#xff0c;下载连接如下&#xff1a; Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本&#xff1a;https://dl.google.com/android/repository/pla…...

STM32笔记---RTC

目录 一、RTC简介 二、主要特性 三、功能描述 3.1 读RTC寄存器 3.2 配置RTC寄存器 四、BKP简介 五、RTC_Init() 1. 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振&#xff08;LSE&#xff09; 3.RTC基本结构 5.RTC_Init()实现 6.time.h 一、R…...

C语言之strstr函数的使用和模拟实现

C语言之strstr函数的模拟实现 文章目录 C语言之strstr函数的模拟实现1. strstr函数的介绍2. strstr函数的使用3. strstr的模拟实现3.1 实现思路3.2 实现代码 1. strstr函数的介绍 函数声明如下&#xff1a; char * strstr ( const char * str1, const char * str2 ); strs…...

【间歇振荡器2片555时基仿真】2022-9-24

缘由multisim出现这个应该怎么解决吖&#xff0c;急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。...

MySQL与PostgreSQL 的一些SQL

MySQL 1、MYSQL输出重定向 将SQL内容输出到文件 nohup mysql -h127.0.0.1 -uroot -ppassword -Ne "sql语句;" > /home/mysql/data/xxxxx.txt &2、时间格式转换 时间转换&#xff0c;转10位时间戳 select UNIX_TIMESTAMP(2021-02-27 00:00:00)SELECT …...

Spring 七大组件

文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean&#xff0c;它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…...

【UGUI】实现跑酷游戏分数血量显示在UI中

//1.实现让玩家的金币分数显示在UI文本中 2.让血量和滑动条关联起来 这一节课主要学会获取组件并改变属性&#xff0c;举一反三&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;//1.实现让玩…...

VLC可见光通信实战:手把手教你用MATLAB仿真DCO-OFDM与ACO-OFDM系统

VLC可见光通信实战&#xff1a;MATLAB仿真DCO-OFDM与ACO-OFDM系统全流程解析 在LED照明普及的今天&#xff0c;可见光通信&#xff08;VLC&#xff09;技术正悄然改变着无线通信的格局。想象一下&#xff0c;未来我们头顶的每一盏LED灯都可能成为高速数据传输的节点——这正是V…...

量子储层计算在对抗鲁棒性中的优势与应用

1. 量子储层计算与对抗鲁棒性研究概述量子储层计算&#xff08;Quantum Reservoir Computing, QRC&#xff09;是近年来量子机器学习领域兴起的一种新型计算范式。与传统的变分量子电路不同&#xff0c;QRC的核心思想是利用量子多体系统固有的高维非线性动力学特性作为"计…...

Cobalt Strike监听器与Payload生成实战:从HTTP到EXE的几种上线方式详解

Cobalt Strike监听器与Payload生成实战&#xff1a;从HTTP到EXE的几种上线方式详解 在渗透测试和红队演练中&#xff0c;Cobalt Strike作为一款成熟的商业框架&#xff0c;其监听器配置与Payload生成能力直接影响攻击链的初期成功率。本文将深入探讨从HTTP到EXE的多种上线技术实…...

海外短剧系统源码带后台 - 多支付对接 + 双端 APP 一键打包上架

海外短剧赛道爆发&#xff0c;全球市场规模持续走高&#xff0c;但语言不通、支付割裂、双端上架难、合规风险高、无法二开&#xff0c;成为多数创业者出海的五大拦路虎。云微海外短剧系统&#xff0c;提供完整前后端源码 独立管理后台 多支付无缝对接 双端 APP 一键打包 包…...

DeepL Chrome扩展:3步打造你的零配置AI翻译助手

DeepL Chrome扩展&#xff1a;3步打造你的零配置AI翻译助手 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 在全球化信息时代&#xff0c;语言障碍是获取知识、沟通…...

PAT/PTA刷题实战:L1-027‘出租’题的三种解法与效率对比(C语言实现)

L1-027‘出租’题的三种解法与效率对比&#xff08;C语言实现&#xff09; 当你面对PTA题库中的L1-027题时&#xff0c;是否曾思考过如何用更高效的方式解决这个看似简单的电话号码转换问题&#xff1f;本文将带你深入探讨三种不同的C语言实现方案&#xff0c;从基础的冒泡排序…...

中国药科大学赵玉成、徐健/皖西学院韩邦兴ACS Catal|元胡中痕量高效镇痛活性成分左旋紫堇达明生物合成最后缺失步骤的解析(附招聘信息)

遇见/摘要延胡索Corydalis yanhusuo W. T. Wang&#xff0c;又称元胡&#xff0c;属于罂粟科紫堇属植物&#xff0c;是传统常用大宗中药&#xff0c;也是浙江道地药材“浙八味”之一。苄基异喹啉生物碱&#xff08;BIAs&#xff09;是延胡索的主要活性成分&#xff0c;如延胡索…...

开拓药业销售业绩超预期 核心脱发新药KX-826进入上市前关键期

近日&#xff0c;开拓药业&#xff08;09939.HK&#xff09;密集发布2026年以来经营及销售成果公告&#xff0c;公司在美妆电商、海外业务、创新原料等板块均实现爆发式增长&#xff0c;商业化能力得到全面验证。随着核心脱发新药KX-826进入上市阶段&#xff0c;这家创新药企正…...

npm恶意软件包瞄准开发者,或致组织沦陷,专家给出防范建议

npm恶意软件包威胁开发者应用开发者收到警告&#xff0c;npm JavaScript注册表中出现了恶意版本的pgserve&#xff08;一款用于应用开发的嵌入式PostgreSQL服务器&#xff09;和automagik&#xff08;一款AI编码工具&#xff09;&#xff0c;这些恶意软件包可能会感染开发者的计…...

2025终极指南:如何用LinkSwift实现八大网盘高速下载的5大技术优势

2025终极指南&#xff1a;如何用LinkSwift实现八大网盘高速下载的5大技术优势 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动…...