c++的std::set和std::unordered_set性能对比 红黑树与哈希表【STL深入】


c++kquote>std::set基于红黑树,有序、支持范围查询,操作O(log n);std::unordered_set基于哈希表,平均O(1)但无序、最坏O(n),依赖哈希质量与负载因子。

std::set 基于红黑树,稳定有序但插入/查找是 O(log n)

std::set 内部用红黑树实现,自动维护元素升序(按 operator 或自定义比较器),所有操作时间复杂度都是 O(log n)。适合需要频繁遍历有序数据、或依赖顺序语义(比如 lower_bound、upper_bound、范围查询)的场景。内存开销相对小,每个节点只存 key 和少量指针(通常 3 指针 + 颜色位),但树结构带来常数因子略高。

std::unordered_set 基于哈希表,平均 O(1) 但最坏 O(n),无序

std::unordered_set 使用开放寻址或链地址法(标准未强制,libc++ 和 libstdc++ 多用桶+链表),平均查找/插入/删除为 O(1),但依赖哈希函数质量和负载因子。当哈希冲突严重或 rehash 频繁时,性能可能退化到 O(n)。不保证顺序,迭代器遍历无逻辑规律。内存占用通常更高:需额外空间存桶数组、空闲槽位或链表指针,且默认最大负载因子为 1.0(可调)。

关键性能影响因素对比

  • 数据规模小(n :std::set 可能更快——哈希计算和桶跳转的开销抵消了 O(1) 优势,红黑树常数更可控。
  • key 类型哈希成本高(如 std::string 长串):std::unordered_set 的哈希计算本身成瓶颈,而 std::set 只做 log n 次比较,反而更稳。
  • 存在大量重复插入/查找,且 key 分布不均:差的哈希函数(如对指针地址直接 cast)易导致聚集,unordered_set 性能骤降;set 则不受影响。
  • 需要范围操作(如 [a,b) 内所有元素):只有 set 支持高效 lower_bound + upper_bound 遍历;unordered_set 必须全表扫描。

实际选型建议

  • 要有序、要范围查询、key 比较便宜(如 int、enum)→ 选 std::set
  • 纯成员存在性判断、插入后不关心顺序、key 有高质量哈希(如内置类型、短 string)、数据量大 → 优先考虑 std::unordered_set
  • 不确定时,先用 unordered_set;若实测发现哈希冲突多(bucket_count() 小但 load_factor() 接近 1)、或出现偶发长延迟,切换为 set 或自定义哈希/调整 max_load_factor()
  • 注意:unordered_set 的迭代器无效化规则更宽松(仅 rehash 时全部失效),而 set 插入不使已有迭代器失效——这对某些算法设计有影响。


# c++  # 内存占用  # red  # String  # enum  # int  # 指针  # operator  # 算法  # 遍历  # 红黑  # 自定义  # 迭代  # 最坏  # 可调  # 都是  # 链表  # 升序  # 已有 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为  c++协程和线程的区别 c++异步编程模型对比【核心】  Bpmn 2.0的XML文件怎么画流程图  php增删改查需要哪些扩展_开启mysqli或pdo扩展方法【说明】  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  作用域操作符会影响性能吗_php静态调用性能分析【教程】  Windows服务持续崩溃怎样修复_系统服务保护机制解析  php下载安装包太大怎么下载_分卷压缩下载方法【教程】  Win10如何备份注册表_Win10注册表备份步骤【攻略】  Win10系统怎么查看显卡温度_Win10任务管理器GPU温度  Win11怎么设置任务栏图标大小_Windows11注册表TaskbarSi修改  Win10怎样卸载TeamViewer_Win10卸载TeamViewer步骤【教程】  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  PyTorch DDP 多进程训练在 Kaggle 笔记本中的正确启动方式  Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】  短链接怎么自定义还原php_修改解码规则适配需求【汇总】  如何更改Windows资源管理器的默认启动位置?(快速访问/此电脑)  微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】  c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  Mac如何设置动态壁纸?(让桌面动起来)  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】  如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Python配置文件操作教程_JSONINIYAML解析与应用实战  PythonGIL机制理解_多线程限制解析【教程】  短链接怎么用php递归还原_多层加密链接的处理法【详解】  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】  How to Properly Use NumPy in VS Code  Win10如何备份驱动程序_Win10驱动备份步骤【攻略】  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  php删除数据怎么加限制_带where条件删除避免全删【指南】  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  使用类变量定义字符串常量时如何实现类型安全的 Literal 注解  Win11怎么开启远程桌面连接_Windows11系统属性远程设置  如何在 Windows 11 中使用 AlomWare 工具箱  如何在 PHP 中按相同键合并两个关联数组为二维数组  Win11怎么更改盘符_Win11磁盘管理修改驱动器号【步骤】  Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看  Python高性能计算项目教程_NumPyCythonGPU并行加速  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】  Windows怎样关闭开始菜单广告_Windows关闭开始菜单广告设置【步骤】  用lighttpd能运行php吗_lighttpd配置php步骤【教程】  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Win10系统字体模糊怎么办_Windows10高级缩放设置修复  如何使用Golang实现多重错误处理_Golangerror组合与判断方法 

 2025-12-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.