C++ multiset怎么用 C++允许重复元素的集合容器【STL】

发布时间 - 2026-02-02 00:00:00    点击率:
multiset与set的关键区别是multiset允许重复元素而set不允许;两者均基于红黑树实现自动升序排序,但multiset的insert()接受重复值,需用count()统计次数,erase(key)删除所有匹配元素,自定义比较器必须满足严格弱序。

multiset 和 set 有什么关键区别?

核心就一点:multiset 允许重复元素,set 不允许。两者底层都是红黑树,自动排序(升序),但 multisetinsert() 不会拒绝相同值——它只是多插一个节点。

这意味着你不能用 operator[]multiset 根本没重载这个),也不能靠 find() 判断“是否存在”来代替“计数”,因为 find() 只返回任意一个迭代器,不反映重复次数。

常见误判场景:想查某个值出现几次,却只调一次 find() 就以为“找到了=存在=1次”,实际可能有 5 次。

怎么插入、遍历和统计重复元素?

插入直接用 insert(),支持单个值、迭代器区间、初始化列表;遍历时用普通迭代器即可,重复元素相邻排列(因有序);统计某值出现次数必须用 count(),不是 size() 或手写循环。

  • multiset s = {1, 2, 2, 2, 3}; —— 合法,含三个 2
  • s.insert(2); —— 插入后共四个 2
  • auto range = s.equal_range(2); —— 返回 pair,左闭右开区间,等价于 count() 但能遍历所有 2
  • s.count(2) 返回 4s.find(2) 只返回第一个 2 的迭代器

删除元素时要注意什么?

multiset::erase() 有三个重载,行为差异极大:

  • erase(iterator):删单个节点(传入的迭代器所指的那个)
  • erase(const key_type&):删掉所有等于该 key 的元素(返回删除个数)
  • erase(iterator first, iterator last):删区间,注意是左闭右开

典型陷阱:s.erase(2) 看似像 find(),实则清空所有 2;若只想删一个,必须先 find() 拿到迭代器再传给 erase(iterator)

另外,erase() 后原迭代器失效(除被删的那个),尤其用 equal_range 得到的迭代器,删完不能再用。

multiset 能否自定义比较规则?

可以,和 set 一样通过模板参数传入比较器,但要注意:自定义比较器必须满足「等价性」,即 comp(a,b)==false && comp(b,a)==false 才算相等。否则 count()equal_range() 行为不可靠。

例如按字符串长度排序:

struct CmpByLen {
    bool operator()(const string& a, const string& b) const {
        return a.length() < b.length(); // ✅ 正确
        // return a.length() <= b.length(); // ❌ 错!不满足严格弱序
    }
};
multiset s;

如果比较逻辑写错,multiset 可能插入失败、遍历乱序,甚至触发未定义行为——这点比 vector 严苛得多,容易被忽略。


# ai  # c++  # 区别  # 排列  # count  # const  # auto  # 字符串  # 循环  # operator  # 迭代  # 遍历  # 自定义  # 升序  # 都是  # 红黑  # 有什么  # 第一个  # 几次  # 你不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何用PHP快速搭建高效网站?分步指南  javascript中的try catch异常捕获机制用法分析  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel观察者模式如何使用_Laravel Model Observer配置  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  教你用AI润色文章,让你的文字表达更专业  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  网站优化排名时,需要考虑哪些问题呢?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  JavaScript模板引擎Template.js使用详解  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在景安服务器上快速搭建个人网站?  Android 常见的图片加载框架详细介绍  如何用美橙互联一键搭建多站合一网站?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何在IIS中新建站点并解决端口绑定冲突?  网站建设保证美观性,需要考虑的几点问题!  如何在阿里云ECS服务器部署织梦CMS网站?  如何利用DOS批处理实现定时关机操作详解  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何配置和使用缓存?(Redis代码示例)  lovemo网页版地址 lovemo官网手机登录  🚀拖拽式CMS建站能否实现高效与个性化并存?  详解Android中Activity的四大启动模式实验简述  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  怎么用AI帮你设计一套个性化的手机App图标?  利用JavaScript实现拖拽改变元素大小  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】