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

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.dtcms.com/a/361540.html

相关文章:

  • [界面通过zmq请求调用指定动态库函数(二)]不同动态库接口不同
  • Unity游戏打包——打包流程
  • 【开题答辩全过程】以 中华美食宝典食谱分享系统的设计与实现为例,包含答辩的问题和答案
  • HTML应用指南:利用GET请求获取MSN财经股价数据并可视化
  • 电脑没加域却能获取到IP地址
  • 力扣hot100 | 堆 | 215. 数组中的第K个最大元素、347. 前 K 个高频元素、128. 最长连续序列
  • 鞍点(Saddle Point)一文通透从曲面直觉到博弈与优化
  • 手写MyBatis第46弹:多插件责任链模式的实现原理与执行顺序奥秘--MyBatis插件架构深度解析
  • 【机器学习学习笔记】numpy基础2
  • 基于站点、模式、遥感多源降水数据融合技术应用
  • 基于单片机自行车码表/骑行运动监测
  • CVE Push Service | 高危漏洞实时情报自动化推送工具
  • Python备份实战专栏第4/6篇:Vue.js + Flask 打造企业级备份监控面板
  • SQLSERVER关键字:N
  • 构建编程知识体系:从菜鸟教程入门到指针精通的系统学习指南
  • 华东制造企业推荐的SD-WAN服务商排名
  • MySQL 8 窗口函数详解
  • 【Linux】终止线程
  • 旧物回收小程序:科技赋能,开启旧物新生之旅
  • 02-Media-1-acodec.py 使用G.711编码和解码音频的示例程序
  • 《投资-41》- 自然=》生物=》人类社会=》商业=》金融=》股市=》投资,其层层叠加构建中内在的相似的规律和规则
  • AR巡检系统:多源数据同步,开启工业智能化新纪元
  • 单链表的基本原理与实现
  • PyCharm 2025版本中新建python工程文件自动创建.venv的意义和作用
  • 【PCIE 系统】111 PCIE 设备 TYPE 0、TYPE 1
  • Google Gemini 2.5 Flash Image(Nano-Banana)震撼登场!人人都能免费用的AI修图神器!
  • 【开题答辩全过程】以 校园帮帮团跑腿系统的设计与实现为例,包含答辩的问题和答案
  • Leetcode 3664. Two-Letter Card Game
  • LeetCode 面试经典 150_滑动窗口_串联所有单词的子串(32_30_C++_困难)(滑动窗口:控制起点和滑动距离)
  • 原位表征技术在水系电池研究稳定性测试中的应用-测试GO