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

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

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

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

std::sets; s.insert(5); s.insert(5); // s.size() == 1 std::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::multisetms = {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
。
基本上就这些区别。选择哪个容器取决于你的具体需求。









