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

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

如果你需要一个能自动排序并且允许重复键的数据结构,那么
multiset
就是更合适的选择。

元素唯一性:set不允许重复,multiset可以
这是两者最根本的区别:
立即学习“C++免费学习笔记(深入)”;
set
插入两个相同的值,第二个会被忽略。
multiset
则会保留两个相同的值。
例如:

std::set s;s.insert(5);s.insert(5);// s.size() == 1std::multiset ms;ms.insert(5);ms.insert(5);// ms.size() == 2
所以在处理频率统计、排行榜等场景时,
multiset
更实用。
插入与删除操作略有不同
虽然两者都有
insert()
和
erase()
方法,但使用方式上有些细节需要注意:
set
的
insert()
返回的是一个
pair
,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 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有何不同 分析允许重复元素的关联容器的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1472367.html
微信扫一扫
支付宝扫一扫