C++,STL容器 unordered_set/unordered_multiset:无序集合/无序多重集合深入解析

【C++】unordered_set 容器的最全解析(什么是unordered_set?unordered_set的常用接口有那些?) 【unordered_set】是STL中的容器之一,不同于普通容器,它的查找速度极快,常用来存储各种经常被检索的数据,因为容器的底层是【哈希表】。除此之外,还可以借助其特殊的性质,解决部分难题。 阅读详情

请添加图片描述


一、容器概览与核心特性

unordered_set和unordered_multiset是C++11引入的哈希容器,以平均O(1)时间复杂度提供快速元素访问能力。与有序容器set/multiset不同,它们通过哈希表实现,不维护元素顺序,适用于需要高频查找但无需排序的场景。


核心特性对比

特性 unordered_set unordered_multiset
元素唯一性 唯一 允许重复
插入复杂度 平均O(1),最差O(n) 同左
查找复杂度 平均O(1),最差O(n) 同左
内存布局 散列存储 散列存储
头文件 <unordered_set> <unordered_set>

二、底层实现原理:哈希表机制

1. 哈希表核心组件

  • 哈希函数:将元素映射到桶索引(hash(key) % bucket_count)

  • 桶数组:存储链表头指针(开链法解决冲突)

  • 负载因子:元素数 / 桶数,触发自动rehash(默认阈值1.0)


    // 哈希表节点结构示意(开链法)
    template <typename T>
    struct HashNode {
   
   
        T value;              // 存储元素值
        HashNode* next;       // 指向下一个节点
        size_t cached_hash;   // 缓存哈希值(优化多次哈希计算)
    };

2. 哈希冲突处理

当不同元素映射到同一桶时,采用链表法处理冲突。C++标准库采用单向链表实现,插入新元素时采用头插法(时间复杂度O(1))。


三、核心操作详解

1. 容器初始化与配置


    // 默认初始化(使用默认哈希和相等比较)
    unordered_set<string> names;  

    // 预分配100个桶 + 自定义哈希函数
    struct Point {
   
    int x, y; };
    struct PointHash {
   
   
        size_t operator()(const Point& p) const {
   
   
            return hash<int>()(p.x) ^ (hash<int>()(p.y) << 1);
        }
    };

    unordered_set<Point, PointHash> points(100);

    // 设置最大负载因子为0.75
    points.max_load_factor(0.75);

2. 元素插入与去重


    unordered_set<int> uniqueNums;
    auto [iter, inserted] = uniqueNums.insert(42);  // C++17结构化绑定
    if (inserted) cout << "插入成功"; 

    // 批量插入(忽略重复)
    vector<int> data {
   
   1, 2, 2, 3}
【 C++ 】unordered_map和unordered_set的介绍和使用 目录 1、unordered系列关联式容器 2、unordered_map unordered_map的介绍 unordered_map的构造方式 unordered_map的函数接口说明 unordered_multimap 3、unordered_set unordered_set的介绍 unordered_set的构造方式 unordered_set的函数接口说明 阅读详情

相关推荐

C++与Python容器深度对比:从内存模型到实战性能优化

容器是编程中用于存储和组织数据的基础数据结构,其核心原理在于如何高效地管理内存和提供数据访问接口。在底层实现上,容器通常分为基于连续内存的数组结构和基于节点链接的链表或树结构,这直接决定了其时间复杂度与缓存友好性。从技术价值看,深入理解容器原理能显著提升程序性能与资源利用率,尤其在处理大规模数据或高性能计算场景时至关重要。应用场景广泛,从日常的业务逻辑数据处理到系统底层开发、算法竞赛及科学计算都离不开对容器的恰当选择。本文聚焦于C++ STL容器与Python内置容器的对比,深入剖析两者在内存模型、迭代器机

weixin_30512043的博客 452

VC++ 6.0模板库深度解析:核心组件、陷阱规避与实战调优

标准模板库(STL)作为C++泛型编程的核心,通过容器、迭代器、算法和函数对象四大组件,实现了数据结构和算法的通用化与高效复用。其原理基于模板元编程,通过编译时多态提升代码复用性和运行效率,技术价值在于显著减少重复代码、提高开发效率并优化程序性能。在工程实践中,STL广泛应用于系统开发、游戏引擎、嵌入式软件等需要高性能数据处理的场景。本文聚焦于Visual C++ 6.0这一特定历史环境下的模板库实现,深入剖析其与现代STL的差异,并针对迭代器失效、模板编译模型等常见陷阱提供实战解决方案,帮助开发者高效维护

weixin_34343000的博客 475

MeshLab新手必看:5分钟搞定泊松表面重建(附完整点云处理流程)

本文详细介绍了如何使用MeshLab进行泊松表面重建,从点云数据导入、预处理到核心参数设置,再到后处理与模型优化,提供了完整的3D重建流程指南。特别适合计算机视觉和3D重建领域的新手快速掌握泊松重建技术,提升工作效率。

kafka6courier的博客 230

Windows 11最新WDK安装避坑指南:从Visual Studio配置到KMDF驱动开发

本文提供了在Windows 11系统上进行KMDF驱动开发的完整环境搭建与实战指南。针对最新WDK与Visual Studio的配置变化,详细解析了从独立安装WDK/SDK、创建首个KMDF驱动项目,到编译排错、部署调试的全流程,帮助开发者高效避坑,顺利开启Windows内核开发。

weixin_29302047的博客 527

别再死记硬背窗函数公式了!用MATLAB实战汉宁窗FIR滤波器,从频谱图看懂‘主瓣’和‘旁瓣’

本文通过MATLAB实战演示汉宁窗FIR滤波器的设计过程,帮助读者从频谱图直观理解主瓣与旁瓣的特性。文章详细对比了矩形窗与汉宁窗的频谱差异,并提供了高通滤波器设计的完整代码示例,适用于数字信号处理学习和工程应用。

weixin_30555125的博客 490

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

搭建sqli-labs靶场时,“Unable to connect to the database: security”报错解决

九芒星的博客 2991

手把手教你用分立元件搭建自举电路:解决高端MOS驱动难题

本文详细介绍了如何用分立元件搭建自举电路,解决高端MOS驱动中的栅源极电压不足问题。通过面包板实验,逐步讲解二极管、电容等关键元件的选型与电路搭建,提供波形调试和常见问题排查方法,帮助工程师提升开关电源和电机驱动等应用的效率与可靠性。

weixin_30555125的博客 153

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3951

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 404

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4116

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: C++,STL容器,map/multimap:映射/多重映射深入解析
下一篇: C++,STL容器,unordered_map/unordered_multimap:无序映射/无序多重映射深入解析
智驾
博客等级 码龄11年 6671粉丝 574原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值