全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++的std::multiset和std::multimap怎么用 允许键重复的关联容器【STL容器】

std::multiset和std::multimap是基于红黑树的有序关联容器,允许键重复;multiset存单一元素,multimap存key-value对,二者均按key升序排列,支持equal_range、count等操作,但无operator[],erase(key)删除所有匹配项。

std::multiset 和 std::multimap 是 C++ STL 中支持重复键的有序关联容器,底层基于红黑树实现,自动维持元素有序,且允许键值重复 —— 这是它们与 set/map 的核心区别。

std::multiset:允许重复的有序集合

multiset 存储单一元素(即只有 key),所有元素按升序排列,相同值可多次插入。它不提供下标访问,但支持迭代器遍历、范围查找和计数。

  • 插入用 insert(),可插入多个相同值:ms.insert(5); ms.insert(5);
  • 查找用 find() 返回首个匹配迭代器;用 count() 获取重复个数(O(log n + k),k 是重复次数)
  • 批量删除某值用 erase(key)(注意:这是重载版本,会删掉所有等于 key 的元素)
  • 要删单个元素,得用 erase(iterator),例如:auto it = ms.find(5); if (it != ms.end()) ms.erase(it);
  • 获取等价元素范围用 equal_range(key),返回 pair,左闭右开区间

std::multimap:允许重复键的有序键值对容器

multimap 存储 key-value 对,按 key 升序排序,相同 key 可对应多个不同 value。key 不可修改(因影响排序),但 value 可改。

  • 插入用 insert({key, value})emplace(key, value),支持重复 key
  • 通过 key 查找时,find() 只返回第一个匹配项;equal_range(key) 更实用,能拿到所有该 key 的键值对区间
  • 遍历某 key 的所有映射:auto [first, last] = mm.equal_range(42); for (auto it = first; it != last; ++it) cout second
  • 注意:multimap 的迭代器解引用得到的是 const pair&,key 是 const,不能写 it->first = ...

常见操作对比:set/map vs multiset/multimap

关键差异不在接口,而在语义和行为:

  • insert(): set/map 插入重复 key 会失败(返回 pair,bool 为 false);multiset/multimap 总成功,返回迭代器
  • operator[]: multimap 没有重载 [],因为 key 不唯一;multiset 根本没有 [](无 key-value 结构)
  • erase(key): 在 multiset/multimap 中会删除所有匹配 key 的元素;在 set/map 中只删一个(实际是删掉那个唯一存在的)
  • size() 与性能: 插入/查找/删除仍为 O(log n),但 count() 和 equal_range 在大量重复时可能接近 O(n),需留意场景

使用建议与注意事项

适合需要按序管理、又允许重复的场景,比如事件时间队列(同一时刻多个事件)、词频统计中间结构、区间索引等。

  • 若只需统计重复次数,考虑用 std::map 更节省空间
  • 若插入后不再修改,且查询以范围为主,multiset/multimap 很合适;若频繁随机查某个 key 的全部 value,equal_range 是标配用法
  • 自定义比较函数时,确保“等价”逻辑与 operator== 一致(尤其用自定义类型作 key 时),否则 find/equal_range 行为可能不符合预期
  • 避免对 multimap 的 key 做非常规修改:虽然技术上可通过 const_cast 强转,但会破坏红黑树结构,导致未定义行为


# ai  # c++  # 区别  # 键值对  # 排列  # if  # count  # for  # auto  # bool  # 接口  # operator  # map  # 事件  # 升序  # 多个  # 这是  # 迭代  # 键值  # 遍历  # 红黑  # 自定义  # 的是  # 第一个 


相关文章: 小程序网站制作需要准备什么资料,如何制作小程序?  如何在阿里云域名上完成建站全流程?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站之星价格显示格式升级,你的预算足够吗?  实例解析Array和String方法  如何自定义建站之星模板颜色并下载新样式?  如何在Windows虚拟主机上快速搭建网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站之星与建站宝盒如何选择最佳方案?  如何在万网自助建站中设置域名及备案?  如何在腾讯云服务器上快速搭建个人网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何用花生壳三步快速搭建专属网站?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  南京网站制作费用,南京远驱官方网站?  如何做网站制作流程,*游戏网站怎么搭建?  如何在万网开始建站?分步指南解析  XML的“混合内容”是什么 怎么用DTD或XSD定义  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何通过VPS搭建网站快速盈利?  网站制作软件有哪些,制图软件有哪些?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站之星安装模板失败:服务器环境不兼容?  网站制作壁纸教程视频,电脑壁纸网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何高效配置IIS服务器搭建网站?  微信小程序 input输入框控件详解及实例(多种示例)  如何通过远程VPS快速搭建个人网站?  如何用IIS7快速搭建并优化网站站点?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  企业微网站怎么做,公司网站和公众号有什么区别?  孙琪峥织梦建站教程如何优化数据库安全?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  韩国服务器如何优化跨境访问实现高效连接?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  魔方云NAT建站如何实现端口转发?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  ,网页ppt怎么弄成自己的ppt?  网站企业制作流程,用什么语言做企业网站比较好?  寿县云建站:智能SEO优化与多行业模板快速上线指南  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  金*站制作公司有哪些,金华教育集团官网?  如何快速搭建高效简练网站?  自助网站制作软件,个人如何自助建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。