news 2026/4/18 12:14:13

C++中set与unordered_set对比指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()监控负载因子。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:11:58

5分钟掌握抖音音频批量提取:开源工具一键搞定创作素材难题

5分钟掌握抖音音频批量提取&#xff1a;开源工具一键搞定创作素材难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…

作者头像 李华
网站建设 2026/4/18 12:10:06

【奇点2026闭门报告首发】:AI代码摘要在金融级系统中的6类不可接受失效场景及防御性编码清单

第一章&#xff1a;【奇点2026闭门报告首发】&#xff1a;AI代码摘要在金融级系统中的6类不可接受失效场景及防御性编码清单 2026奇点智能技术大会(https://ml-summit.org) 金融级系统对语义保真度、时序确定性与边界可验证性存在硬性SLA约束&#xff0c;而当前主流AI代码摘要…

作者头像 李华
网站建设 2026/4/18 12:09:26

PPTAgent:如何在3分钟内将文档转换为专业演示文稿?

PPTAgent&#xff1a;如何在3分钟内将文档转换为专业演示文稿&#xff1f; 【免费下载链接】PPTAgent An Agentic Framework for Reflective PowerPoint Generation 项目地址: https://gitcode.com/gh_mirrors/pp/PPTAgent 你是否曾经花费数小时整理文档内容&#xff0c…

作者头像 李华
网站建设 2026/4/18 12:09:25

009-智能体的“大脑”:大语言模型(LLM)的集成、微调与本地化部署

009-智能体的“大脑”:大语言模型(LLM)的集成、微调与本地化部署 一、从一次深夜调试说起 上周三凌晨两点,我被一条报警短信叫醒:线上智能客服的响应延迟飙到了15秒。登录服务器一看,CPU和内存都正常,问题出在调用大模型API的环节——某个第三方服务突然开始限流,而我…

作者头像 李华
网站建设 2026/4/18 12:09:24

为什么说协作机器人是未来智能工厂的“标准员工

随着“工业4.0”和智能制造不断深入&#xff0c;工厂的生产方式正在发生根本性变化。过去&#xff0c;工厂里最辛苦的是人&#xff1b;现在&#xff0c;越来越多“不怕累、不抱怨、学习快”的新员工正在上岗——它们就是协作机器人。有人问&#xff1a;工业机器人已经用了这么多…

作者头像 李华
网站建设 2026/4/18 12:08:12

光伏发电储能系统建模研究:MPPT控制与储能充放电控制

光伏发电储能系统建模研究:MPPT控制与储能充放电控制 摘要 光伏发电储能系统是推动可再生能源高效利用的关键技术之一。本文围绕光伏发电储能系统的建模与仿真展开研究,主要内容分为两大模块:第一,光伏发电系统的最大功率点跟踪(MPPT)控制建模,分别实现扰动观察法(P&…

作者头像 李华