C++ multiset怎么用 C++允许重复元素的集合容器【STL】
发布时间 - 2026-02-02 00:00:00 点击率:次multiset与set的关键区别是multiset允许重复元素而set不允许;两者均基于红黑树实现自动升序排序,但multiset的insert()接受重复值,需用count()统计次数,erase(key)删除所有匹配元素,自定义比较器必须满足严格弱序。
multiset 和 set 有什么关键区别?
核心就一点:multiset 允许重复元素,set 不允许。两者底层都是红黑树,自动排序(升序),但 multiset 的 insert() 不会拒绝相同值——它只是多插一个节点。
这意味着你不能用 operator[](multiset 根本没重载这个),也不能靠 find() 判断“是否存在”来代替“计数”,因为 find() 只返回任意一个迭代器,不反映重复次数。
常见误判场景:想查某个值出现几次,却只调一次 find() 就以为“找到了=存在=1次”,实际可能有 5 次。
怎么插入、遍历和统计重复元素?
插入直接用 insert(),支持单个值、迭代器区间、初始化列表;遍历时用普通迭代器即可,重复元素相邻排列(因有序);统计某值出现次数必须用 count(),不是 size() 或手写循环。

-
multiset—— 合法,含三个 2s = {1, 2, 2, 2, 3}; -
s.insert(2);—— 插入后共四个 2 -
auto range = s.equal_range(2);—— 返回pair,左闭右开区间,等价于count()但能遍历所有 2 -
s.count(2)返回4,s.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新建多桌面切换操作【技巧】

