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

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合

往期回顾:

C++ 入门17:STL 容器之映射(map)与多重映射(multimap)_-CSDN博客

C++ 入门18:STL 容器之栈(stack)与队列(queue)-CSDN博客

C++ 入门19:STL 容器之优先队列(priority_queue)-CSDN博客


 C++ 入门第 20 天:STL 容器之无序集合与无序多重集合

一、前言

在之前的学习中,我们已经掌握了 setmultiset 容器,它们都是有序关联容器。但在某些场景下,我们并不关心元素的顺序,而是追求更高的性能。在这种情况下,C++ 提供了 无序容器,例如 unordered_setunordered_multiset,它们的底层基于 哈希表(Hash Table) 实现,能够以常数时间完成插入、删除和查找操作。

1. 无序集合(unordered_set)

unordered_set 是一个 无序关联容器,用于存储不重复的元素。与 set 不同,unordered_set 的元素没有顺序,它的主要特点是:

  1. 底层实现:基于哈希表,操作效率高。
  2. 唯一性:不允许重复元素。
  3. 平均时间复杂度:插入、删除、查找的时间复杂度为 O(1)O(1)O(1)。

1.1 基本操作

以下是 unordered_set 的常用操作:

成员函数功能说明
insert(value)插入元素
erase(value)删除指定元素
find(value)查找元素,返回迭代器
count(value)检查某元素是否存在(返回 0 或 1)
size()获取元素个数
empty()检查容器是否为空

示例代码:基本操作 

#include <iostream>
#include <unordered_set>
using namespace std;int main() {// 定义一个无序集合unordered_set<int> us;// 插入元素us.insert(10);us.insert(20);us.insert(30);us.insert(10); // 重复元素将被忽略// 遍历集合cout << "Elements in unordered_set: ";for (int elem : us) {cout << elem << " ";}cout << endl;// 查找元素if (us.find(20) != us.end()) {cout << "Element 20 is found in the unordered_set." << endl;}// 删除元素us.erase(10);cout << "After removing 10, elements in unordered_set: ";for (int elem : us) {cout << elem << " ";}cout << endl;return 0;
}

注意:输出的元素顺序与插入顺序无关,因为 unordered_set 使用哈希表存储数据。 

1.2 哈希表的特性

无序集合通过哈希函数将值映射到特定的存储位置。哈希表的效率依赖于:

  1. 哈希函数:将值映射到存储位置。
  2. 装载因子(load factor):当前元素数量与桶数量的比值。过高时,哈希表会进行重新哈希(rehash)。

我们可以通过以下函数查看或修改哈希表的状态:

成员函数功能说明
bucket_count()返回桶的数量
load_factor()返回装载因子
max_load_factor(f)设置装载因子的上限
rehash(n)强制重新哈希并至少设置 n 个桶

示例代码:查看哈希表状态

#include <iostream>
#include <unordered_set>
using namespace std;int main() {unordered_set<int> us = {10, 20, 30};cout << "Bucket count: " << us.bucket_count() << endl;cout << "Load factor: " << us.load_factor() << endl;// 强制重新哈希us.rehash(20);cout << "After rehash, bucket count: " << us.bucket_count() << endl;return 0;
}

2. 无序多重集合(unordered_multiset)

unordered_multisetunordered_set 类似,不同点是:

  1. 允许重复元素:可以插入多个值相同的元素。
  2. 哈希表存储:仍然基于哈希表实现。

2.1 基本操作

unordered_multiset 的常用操作与 unordered_set 类似,但允许重复元素:

成员函数功能说明
insert(value)插入元素
erase(value)删除指定元素
count(value)返回某元素出现的次数

示例代码:无序多重集合

#include <iostream>
#include <unordered_set>
using namespace std;int main() {// 定义一个无序多重集合unordered_multiset<int> ums;// 插入元素ums.insert(10);ums.insert(20);ums.insert(10); // 允许重复// 遍历集合cout << "Elements in unordered_multiset: ";for (int elem : ums) {cout << elem << " ";}cout << endl; // 输出:10 20 10(顺序可能不同)// 查询某元素的出现次数cout << "Count of 10: " << ums.count(10) << endl;// 删除某个值的所有实例ums.erase(10);cout << "After removing 10, elements in unordered_multiset: ";for (int elem : ums) {cout << elem << " ";}cout << endl;return 0;
}

3. unordered_setunordered_multiset 的性能分析

优点

  1. 高效:基于哈希表实现,插入、删除、查找的平均时间复杂度为 O(1)O(1)O(1)。
  2. 灵活:支持快速查找和重复值存储。

缺点

  1. 顺序无保证:无法保证元素存储顺序,适合只关心内容的场景。
  2. 哈希冲突:当冲突较多时,性能可能下降,接近 O(n)O(n)O(n)。

对比:set vs unordered_set

特性setunordered_set
底层结构红黑树哈希表
是否有序有序无序
查找时间复杂度O(log⁡n)O(\log n)O(logn)O(1)O(1)O(1)(平均情况)
插入、删除时间复杂度O(log⁡n)O(\log n)O(logn)O(1)O(1)O(1)(平均情况)

4. 实际应用场景

  • 去重unordered_set 适合需要去重但不关心顺序的场景,例如统计某一组数据中不重复的值。
  • 频率统计unordered_multiset 可以用来统计某些值的出现次数。
  • 高效查找:在大规模数据中快速查找是否存在某元素。

    示例:统计字符串中单词出现次数

    使用 unordered_multiset 来统计一个字符串中单词的频率。

    示例代码
    #include <iostream>
    #include <unordered_set>
    #include <sstream>
    #include <string>
    using namespace std;int main() {string text = "hello world hello C++ world";unordered_multiset<string> wordCount;// 将字符串分割为单词stringstream ss(text);string word;while (ss >> word) {wordCount.insert(word);}// 输出每个单词的出现次数for (const string& w : wordCount) {cout << w << ": " << wordCount.count(w) << endl;wordCount.erase(w); // 删除已处理的单词}return 0;
    }
    

    结语

    以上就是 C++ 标准模板库中的无序集合与无序多重集合的基础知识点了。这些无序容器通过哈希表实现,能够提供极高的操作效率,适用于需要快速查找、插入和删除的场景。掌握无序集合与无序多重集合的使用,基本上在开发中都会用到的,大家多看看,一定要掌握。

  • 都看到这里了,点个赞再走呗朋友~

  • 加油吧,预祝大家变得更强!

相关文章:

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合

往期回顾&#xff1a; C 入门17&#xff1a;STL 容器之映射&#xff08;map&#xff09;与多重映射&#xff08;multimap&#xff09;_-CSDN博客 C 入门18&#xff1a;STL 容器之栈&#xff08;stack&#xff09;与队列&#xff08;queue&#xff09;-CSDN博客 C 入门19&#x…...

devops-部署Harbor实现私有Docker镜像仓库

文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心&#xff0c;它使用策略和基于角色的访问控制来保护工件&#xff0c;确保镜像被扫描并且没有漏洞&#xff0c;并将镜像签名为可信的。Harbor是CNCF的一个毕业项目&#xff0…...

rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别

在Git版本控制系统中&#xff0c;rebase 和 merge 是两种不同的操作&#xff0c;用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起&#xff0c;但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...

Vulhub:Jackson[漏洞复现]

CVE-2017-7525(Jackson反序列化) 启动漏洞环境 docker-compose up -d 阅读vulhub给出的漏洞文档 cat README.zh-cn.md # Jackson-databind 反序列化漏洞&#xff08;CVE-2017-7525&#xff09; Jackson-databind 支持 [Polymorphic Deserialization](https://github.com/Fas…...

strongswan构建测试环境

make-testing脚本文件负责构建strongswan的虚拟化测试系统。位于目录strongswan-5.9.14/testing/&#xff0c;需要以管理员身份运行make-testing。生成测试用到的虚拟客户机镜像&#xff0c;KVM虚拟机和虚拟网络的配置文件位于目录:config/kvm。 ~/strongswan-5.9.14/testing$…...

前端:金额高精度处理

Decimal 是什么 想必大家在用js 处理 数字的 加减乘除的时候&#xff0c;或许都有遇到过 精度不够 的问题&#xff0c;还有那些经典的面试题 0.20.1 ! 0.3&#xff0c; 至于原因&#xff0c;那就是 js 计算底层用的是 IEEE 754 &#xff0c;精度上有限制&#xff0c; 那么Deci…...

面试题整理3----nc命令的常见用法

面试题整理3----nc命令的常见用法 1. NC是什么2. NC的常用参数2.1 开启指定端口TCP监听(-l小写的L)2.2 测试端口是否能访问(-v)2.3 开启指定端口UDP监听(-u)2.4 端口扫描(-z)2.5 指定超时时间(-w)2.6 指定本地端口号连接(-p)2.7 指定的命令(-e) 1. NC是什么 nc&#xff08;Net…...

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…...

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统&#xff08;VCS&#xff09; 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...

Oracle 技术精选学习

Oracle 技术犹如一座闪耀着无尽光芒的灯塔&#xff0c;为众多 IT 从业者和技术爱好者照亮了前行的道路。无论是数据库管理、企业应用开发还是数据分析&#xff0c;Oracle 都以其强大、稳定和广泛的应用而占据着行业的重要地位。学习 Oracle 技术&#xff0c;更是能为个人带来诸…...

sqlilabs第三十关到第三十五关靶场攻略

第三十关 第三十关和二十九关差不多&#xff0c;将单引号换成双引号 查询表名&#xff0c;字段名&#xff0c;数据 ?id1&id-2" union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- ?id1&id-2" …...

windows免登录linux

windows 生成秘钥文件 ssh-keygen -t rsa 将公钥传送到服务器 scp C:\Users\xx/.ssh/id_rsa.pub xxxx:/home/ruoyi/id_rsa.pub linux 使用ssh-copy-id -i ~/.ssh/id_rsa.pub userhost 如果禁用root登录&#xff0c;先开启 vim /etc/ssh/sshd_config PermitRootLogin yes …...

matlab绘图时设置左、右坐标轴为不同颜色

目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线&#xff0c;需要对两条曲线进行分别描述时&#xff0c;应设置左、右坐标轴为不同颜色&#xff0c;并设置刻度线&#xff0c;且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现&#xff1a; 1…...

springboot+javafx使用aop切面导致的fx:id不能被注入问题

记录一个我遇到得问题 问题描述 我本来使用AOP切面来进行全局异常管理&#xff0c;但是使用AOP之后fxml中通过fx:id绑定得参数无法被注入 Slf4j Component Aspect public class GlobalExceptionAspect {AfterThrowing(pointcut "execution(* com.shkj.videoclassifica…...

说说你对java lambda表达式的理解?

大家好&#xff0c;我是锋哥。今天分享关于【说说你对java lambda表达式的理解?】面试题。希望对大家有帮助&#xff1b; 说说你对java lambda表达式的理解? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java Lambda 表达式是 Java 8 引入的一项重要特性&#…...

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…...

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;初始化线性表、销毁线性表、判定是否为空表、求线性…...

设计模式之桥接模式:抽象与实现之间的分离艺术

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器&#xff0c;无论是索尼还是三星的电视机&#xff0c;遥控器的按键功能都差不多&#xff1…...

网络隧道与代理

文章目录 网络隧道网络代理参考 网络隧道 使用隧道的原因是在不兼容的网络上传输数据&#xff0c;或在不安全网络上提供一个安全路径。网络隧道的一个典型特征就是封装报文和对报文加密。如下是两个典型的案例&#xff1a;IPv4到IPv6的迁移、VPN。 图3.1 IPv4到IPv6的迁移 图…...

游戏关卡分析:荒野大镖客2雪山终战

1、相关剧情 主角约翰一家在农场过着悠闲的日子&#xff0c;突然平静被打破&#xff0c; 女枪手来报信&#xff0c;在某小镇找到了迈卡的消息。 于是激发了约翰的满腔怒气&#xff0c;不顾妻子的反对&#xff0c;坚决要出战&#xff0c; 要彻底歼灭迈卡&#xff0c;为亚瑟…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...