首页 > 后端开发 > C++ > 正文

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

P粉602998670
发布: 2025-08-22 10:25:01
原创
253人浏览过

set和multiset的核心区别在于元素唯一性:1.set不允许重复元素,插入相同值时第二个会被忽略;2.multiset允许重复值存在,所有插入都会保留。此外,插入操作返回类型不同:set的insert()返回pair<iterator, bool>,而multiset只返回iterator。删除操作也不同:set用erase(value)删除唯一元素,multiset用erase(value)则删除所有相同元素,若要删一个需传迭代器。查找行为方面:set的find()返回唯一元素,multiset可能返回多个,常用equal_range(key)获取相同值的范围。适用场景:set适用于存储唯一键,multiset适用于频率统计、排行榜等需重复元素的场景。

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

在C++标准库中,

set
登录后复制
multiset
登录后复制
都属于关联容器,底层通常由红黑树实现,支持自动排序。它们的核心区别在于:
set
登录后复制
不允许重复元素,而
multiset
登录后复制
允许重复值存在

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

如果你需要一个能自动排序并且允许重复键的数据结构,那么

multiset
登录后复制
就是更合适的选择。

C++ STL multiset和set有何不同 分析允许重复元素的关联容器

元素唯一性:set不允许重复,multiset可以

这是两者最根本的区别:

立即学习C++免费学习笔记(深入)”;

  • set<int>
    登录后复制
    插入两个相同的值,第二个会被忽略。
  • multiset<int>
    登录后复制
    则会保留两个相同的值。

例如:

C++ STL multiset和set有何不同 分析允许重复元素的关联容器
std::set<int> s;
s.insert(5);
s.insert(5);
// s.size() == 1

std::multiset<int> ms;
ms.insert(5);
ms.insert(5);
// ms.size() == 2
登录后复制

所以在处理频率统计、排行榜等场景时,

multiset
登录后复制
更实用。


插入与删除操作略有不同

虽然两者都有

insert()
登录后复制
erase()
登录后复制
方法,但使用方式上有些细节需要注意:

降重鸟
降重鸟

要想效果好,就用降重鸟。AI改写智能降低AIGC率和重复率。

降重鸟 113
查看详情 降重鸟
  • set
    登录后复制
    insert()
    登录后复制
    返回的是一个
    pair<iterator, bool>
    登录后复制
    ,bool表示是否插入成功(因为不能重复)。
  • multiset
    登录后复制
    insert()
    登录后复制
    只返回一个
    iterator
    登录后复制
    ,因为总是可以插入。

删除方面也有差异:

  • set
    登录后复制
    erase(value)
    登录后复制
    会删除唯一的那个元素(如果存在的话)。
  • multiset
    登录后复制
    erase(value)
    登录后复制
    会删除所有等于该值的元素。

如果你只想删掉一个特定值的实例,应该传迭代器进去:

auto it = ms.find(5);
if (it != ms.end()) {
    ms.erase(it); // 只删一个
}
登录后复制

查找操作的行为也有所不同

查找元素时,

set
登录后复制
找到的就是唯一的那个;而
multiset
登录后复制
可能有多个相同元素。

常用的方法包括:

  • find()
    登录后复制
    :返回第一个匹配的元素。
  • count(key)
    登录后复制
    :返回有多少个相同值的元素。
  • equal_range(key)
    登录后复制
    :返回一对迭代器,表示所有等于key的元素范围。

举个例子:

std::multiset<int> ms = {3, 5, 5, 7};
auto range = ms.equal_range(5);
for (auto it = range.first; it != range.second; ++it) {
    std::cout << *it << " ";
}
// 输出:5 5
登录后复制

这个功能在做区间查找或批量处理时非常有用。


总结一下适用场景

  • 如果你希望存储唯一值,并且每个值只能出现一次,就选
    set
    登录后复制
  • 如果你需要支持重复元素、统计频率、维护有序列表但又不想自己排序,就用
    multiset
    登录后复制

基本上就这些区别。选择哪个容器取决于你的具体需求。

以上就是C++ STL multiset和set有何不同 分析允许重复元素的关联容器的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号