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

setmultiset的核心区别在于元素唯一性:1.set不允许重复元素,插入相同值时第二个会被忽略;2.multiset允许重复值存在,所有插入都会保留。此外,插入操作返回类型不同:set的insert()返回pair,而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

插入两个相同的值,第二个会被忽略。

multiset

则会保留两个相同的值。

例如:

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++数组初始化列表 统一初始化语法应用
上一篇 2025年12月18日 19:33:50
C++ span容器 连续序列视图实现
下一篇 2025年12月18日 19:34:03

相关推荐

发表回复

登录后才能评论
关注微信