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

C++ multiset数据结构的使用情况说明

在什么情况下需要使用 multiset

在这篇文章中,我们先简单回顾一下 multiset 的特性,然后结合实际场景来分析。


multiset 的特性(C++ STL 为例)

  1. 自动有序

    • 元素会按照比较函数(默认是升序)自动排序。
    • 不需要手动调用 sort
  2. 允许重复元素

    • 不同于 set(不允许重复),multiset 可以有相同值的元素,而且会把它们都存储起来。
  3. 基于平衡二叉搜索树(通常是红黑树)实现

    • 插入、删除、查找的时间复杂度是 O(log n)
  4. 迭代器稳定

    • 插入和删除不会让其他元素的迭代器失效(除了被删除的元素)。

什么时候用 multiset

1. 需要维护一个有序集合,且允许重复元素

  • 例如存储多个考试成绩,并且需要随时按分数从高到低(或低到高)输出。
  • 不适合用 set(会去重),用 vector 每次排序又太慢。
multiset<int> scores;
scores.insert(90);
scores.insert(85);
scores.insert(90); // 重复分数也能插入

2. 随时插入、删除,并保持有序

  • multiset 适合动态场景:
    • 游戏排行榜
    • 股票价格实时排名
    • 数据流的中位数维护
multiset<int> prices;
prices.insert(100);
prices.erase(prices.find(100));

(注意 erase(value) 会删除所有等于该值的元素,如果只想删一个需要 erase(iterator)


3. 需要高效统计某个元素的出现次数

  • count() 在 O(log n) 内查看某个值的数量。
  • 比如投票系统统计某个候选人票数。

4. 实现优先队列但需要支持删除任意元素

  • 普通 priority_queue 不能快速删除中间元素,而 multiset 可以。

5. 需要区间查询

  • lower_bound() / upper_bound() 可以快速找区间内的元素,比如:
    • 找出分数在 [80, 90] 的学生数量
    • 找出大于某个值的最小元素

总结简单记忆

  • 如果你需要有序 + 允许重复 + 动态插入删除 → 用 multiset
  • 如果只是有序 + 不允许重复 → 用 set
  • 如果是频率统计 + 无序 → 用 unordered_multisetunordered_map
http://www.xdnf.cn/news/19553.html

相关文章:

  • 基于单片机智能饮水机/智能热水壶
  • 正式发布!2025AI SEO公司哪家专业?
  • 【数据分享】多份土地利用矢量shp数据分享-澳门
  • C# FlaUI win 自动化框架,介绍
  • 员工自愿放弃社保,企业给补贴合法吗?
  • Vue3 中 Proxy 在组件封装中的妙用
  • Windows 使用 Compass 访问MongoDb
  • 【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解
  • 笔记:现代操作系统:原理与实现(1)
  • 卷积神经网络中的两个重要概念——感受野receptive filed和损失函数loss function
  • 【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】
  • 刘洋洋《一笔相思绘红妆》上线,献给当代痴心人的一封情书
  • CUDA编程11 - CUDA异步执行介绍
  • Java 不支持在非静态内部类中声明静态 Static declarations in inner classes are not supported异常处理
  • elasticsearch中文分词器analysis-ik使用
  • Uniapp 生命周期详解:页面生命周期 vs 应用生命周期(附实战示例)
  • 大模型应用开发面试实录:LLM原理、RAG工程与多Agent场景化落地解析
  • gh-pages部署github page项目
  • DAY 20 奇异值SVD分解-2025.9.1
  • 计组(2)CPU与指令
  • (ssh客户端)远程连接工具windterm使用教程(ssh工具、远程工具)
  • MiniCPM-V-4.5:重新定义边缘设备多模态AI的下一代视觉语言模型
  • 飞腾2000+/64核 PCIE扫描异常问题排查
  • COM组件——ServicedComponent 类
  • 【架构师干货】系统架构设计
  • Vue3 + MQTT + 高德地图 实现车辆在线状态与实时位置更新
  • 云手机和云游戏之间有着哪些区别?
  • qData 数据中台【开源版】发布 1.0.4 版本,全面升级数据清洗与资产管理能力
  • 使用LoadBalancer替换Ribbon(五)
  • 使用C#语言 基于FTP协议进行文件夹上传下载