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

C++中set与unordered_set对比指南

C++ 中 set 和 unordered_set 使用指南

一、核心概念
  1. set特点

    • 基于红黑树实现,元素自动排序(默认升序)
    • 操作时间复杂度:$O(\log n)$
    • 需要头文件:#include <set>
  2. unordered_set特点

    • 基于哈希表实现,元素无序存储
    • 平均时间复杂度:$O(1)$(最坏情况 $O(n)$)
    • 需要头文件:#include <unordered_set>

二、基本操作对比
操作setunordered_set
插入元素.insert(value).insert(value)
删除元素.erase(value).erase(value)
查找元素.find(value).find(value)
检查存在性.count(value) > 0.count(value) > 0
元素数量.size().size()

三、代码示例
#include <iostream> #include <set> #include <unordered_set> int main() { // 1. set 使用示例(自动排序) std::set<int> orderedSet; orderedSet.insert({3, 1, 4, 2}); // 插入元素 std::cout << "Set 内容(已排序): "; for (int num : orderedSet) std::cout << num << " "; // 输出: 1 2 3 4 // 2. unordered_set 使用示例(无序存储) std::unordered_set<int> unorderedSet; unorderedSet.insert({3, 1, 4, 2}); std::cout << "\nUnordered_set 内容: "; for (int num : unorderedSet) std::cout << num << " "; // 输出可能: 2 4 1 3(顺序不确定) // 3. 查找操作对比 std::cout << "\n\n查找结果: "; std::cout << "Set 查找4: " << (orderedSet.find(4) != orderedSet.end()); std::cout << " | Unordered_set 查找4: " << (unorderedSet.find(4) != unorderedSet.end()); // 4. 删除操作 orderedSet.erase(2); unorderedSet.erase(2); return 0; }

四、选择建议
  1. 优先使用unordered_set当:

    • 需要极速查找($O(1)$ 平均复杂度)
    • 元素顺序无关紧要
    • 自定义哈希函数(对自定义类型)
  2. 选择set当:

    • 需要有序遍历元素
    • 需要范围查询(如lower_bound()
    • 元素比较操作简单(对自定义类型需重载<

五、进阶技巧
  1. 自定义排序规则(set)
struct CustomCompare { bool operator()(const int& a, const int& b) const { return a > b; // 改为降序 } }; std::set<int, CustomCompare> customSet;
  1. 自定义哈希函数(unordered_set)
struct MyHash { size_t operator()(const std::string& s) const { return s.length(); // 按字符串长度哈希 } }; std::unordered_set<std::string, MyHash> customUnorderedSet;

关键提示unordered_set的性能取决于哈希函数质量,劣质哈希可能导致 $O(n)$ 复杂度。当元素数量超过桶数量时,会自动重新哈希(rehash),可通过.load_factor()监控负载因子。

http://www.jsqmd.com/news/660711/

相关文章:

  • Git Worktree 保姆级教程:AI编程必备技能!带你熟练掌握!
  • 船舶自动化中的数字化: 为什么可靠的边缘系统在海上至关重要?
  • .NET Windows Desktop Runtime:彻底告别Windows桌面应用部署难题的终极解决方案
  • Go-CQHTTP终极教程:如何用5个步骤搭建你的专属QQ机器人
  • MATLAB 2023新手避坑指南:从台大郭彦甫经典教程到官方文档的实战迁移
  • UE5 C++背包系统:从入门到精通
  • ApkShellext2:让Windows资源管理器也能“看懂“应用包文件
  • 5个实用技巧:如何高效配置Zotero-OCR插件实现PDF文字识别
  • Cursor Free VIP:三步免费激活AI编程神器的完整指南
  • FanControl终极指南:3分钟掌握Windows风扇控制自由
  • OpenRGB终极指南:一键统一控制所有RGB设备,告别繁琐厂商软件
  • 如何快速掌握PCILeech:面向安全研究员的完整DMA攻击指南
  • Hyper-V装Win10卡在第一步?检查这3个设置(BIOS/功能/镜像版本)
  • 一物一码系统英文之外,品牌更需要统一数字语言
  • 16 - Go 协程(goroutine):从基础到实战
  • 告别卡顿!在Auto.js中用好多线程Threads,让你的自动化脚本飞起来
  • 用Python和C++搞定算法竞赛中的同余问题:从模运算到CRT实战代码
  • 中兴光猫工厂模式解锁实践:zteOnu工具深度解析与技术实现
  • 深度解析R3nzSkin内存换肤技术:实现游戏内容实时渲染的完整方案
  • OBS StreamFX插件实战教程:从零打造电影级直播画面
  • 3个核心痛点:UABEA如何帮你彻底解决Unity资源管理难题
  • 如何轻松提取抖音音频?这款免费工具让你效率提升10倍!
  • 保姆级教程:手把手教你用SIG官网完成蓝牙BQB列名(附Component QDID组合实战)
  • OWL ADVENTURE在网络安全中的应用:恶意图像与钓鱼网站视觉检测
  • 如何在3分钟内完成革命性远程桌面连接?BilldDesk Pro突破性解决方案揭秘
  • 别再硬扛多项式了!用Python的curve_fit搞定高斯拟合,实测物理实验数据处理
  • 发现你的跨平台文本编辑新伙伴:Notepad-- 如何让代码编写更高效
  • JPEXS免费Flash反编译器:5分钟掌握终极SWF资源提取与代码恢复技巧
  • 生物信息学新手村任务:5分钟上手,用Grabseqs一站式下载并转换SRA为Fastq
  • Java 面试:微服务与云原生技术的深度探讨