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

【STL】set、multiset、unordered_set、unordered_multiset 的区别

在 C++ STL 中,setmultiset 是经常使用的关联式容器,而从 C++11 开始,又引入了 unordered_setunordered_multiset
很多同学在学习时常常会混淆它们的区别,今天我们就来系统梳理一下。


1. set

  • 特点

    • 元素 唯一
    • 元素 自动排序(默认升序,可自定义比较函数)
    • 底层实现:红黑树(平衡二叉搜索树)
  • 示例

#include <set>
#include <iostream>
using namespace std;int main() {set<int> s;s.insert(3);s.insert(1);s.insert(3); // 插入失败,元素必须唯一for (int v : s) cout << v << " "; // 1 3
}

2. multiset

  • 特点

    • 元素 允许重复
    • 元素 自动排序
    • 底层实现:红黑树
  • 示例

#include <set>
#include <iostream>
using namespace std;int main() {multiset<int> ms;ms.insert(3);ms.insert(1);ms.insert(3); // 插入成功,可重复for (int v : ms) cout << v << " "; // 1 3 3
}
  • 删除操作差异

    multiset<int> ms = {1, 2, 2, 3};
    ms.erase(2);  // 删除所有 key=2 的元素
    // 如果只想删除一个,可以用迭代器:
    auto it = ms.find(2);
    if (it != ms.end()) ms.erase(it);
    

3. unordered_set

  • 特点

    • 元素 唯一
    • 元素 无序存储(不保证顺序)
    • 底层实现:哈希表
    • 查找、插入、删除 平均 O(1) ,性能通常比 set 更高
  • 示例

#include <unordered_set>
#include <iostream>
using namespace std;int main() {unordered_set<int> us;us.insert(5);us.insert(1);us.insert(5); // 插入失败,元素必须唯一for (int v : us) cout << v << " "; // 输出顺序不固定
}

4. unordered_multiset

  • 特点

    • 元素 允许重复
    • 元素 无序存储
    • 底层实现:哈希表
    • 查找、插入、删除 平均 O(1)
  • 示例

#include <unordered_set>
#include <iostream>
using namespace std;int main() {unordered_multiset<int> ums;ums.insert(5);ums.insert(5);ums.insert(1);for (int v : ums) cout << v << " "; // 输出顺序不固定
}

5. 四者对比总结

其实这四者的区别很明显也很容易懂。只要不去涉及底层原理,看下面这张表就行了。

容器类型元素唯一性是否有序底层结构插入/查找/删除复杂度
set唯一有序红黑树O(log n)
multiset可重复有序红黑树O(log n)
unordered_set唯一无序哈希表平均 O(1),最坏 O(n)
unordered_multiset可重复无序哈希表平均 O(1),最坏 O(n)

总结一下

就是带有multi的就是可以有重复元素;带有unordered就是无序,然后性能更好点。


6. 使用场景的建议

  • set:需要保持元素唯一,且要有序(如 ID 集合、排行榜)。
  • multiset:需要存储重复元素,且要有序(如成绩表、频率统计)。
  • unordered_set:需要元素唯一,且更关心性能,不在意顺序(如哈希去重)。
  • unordered_multiset:需要存储重复元素,且更关心性能,不在意顺序(如计数场景)。

http://www.dtcms.com/a/561711.html

相关文章:

  • HTTP 协议和 MQTT 协议的区别
  • 景区门户网站建设ui设计可以在ipad上面做嘛?
  • 2025年江西省职业院校技能大赛高职组“区块链技术应用”竞赛第六套任务书解析答案
  • 巴中房产网站建设推广网站发布文章
  • 北京网站建设价钱莱芜金点子信息港招聘
  • 摄影入门学习笔记
  • 网站设置怎么调济南网站建设方案书范文
  • 服务器怎么放网站吗国家商标免费查询入口
  • iOS八股文之 组件化
  • 系统规划与管理师 论文范文
  • visual studio做的网站商品推广软文800字
  • 个人网站推广方法小型的游戏网站怎么做
  • Photoshop - Photoshop 工具栏(22)单行选框工具
  • 郑州网站设计见效快服装设计网站有哪些
  • 第一章:从零开始构建你的第一个C#/.NET应用程序
  • 【51单片机】【protues仿真】基于51单片机波形发生器系统
  • Debug —— 本地Mysql数据迁移到Docker的Mysql容器中,使用创建容器时的正确密码登录失败
  • Mesh Wi-Fi网络技术
  • SpringBoot的yaml配置文件,热部署
  • 我网站正在建设中wordpress 403
  • 【深度学习】超参数调整(Hyperparameter Tuning)
  • .net 网站开发教程wordpress阿里云oss插件
  • 【Linux】多路转接epoll
  • Flutter中mixing的原理及应用场景
  • 如何做购物网站吴谨含厂家不愿做网站
  • 如何编译QT可执行release程序
  • 网站优化竞争对手分析自己做的娱乐平台网站
  • 个人网站 审批wordpress文件上传
  • 跟der包学习java_day3「运算符和表达式」
  • 720全景网站怎么做wordpress 白边