set不允许重复元素,multiset允许重复;两者均基于红黑树实现,自动排序,支持O(log n)插入、删除、查找;根据是否需去重选择容器类型。

在C++标准模板库(STL)中,set 和 multiset 是两种常用的关联式容器,它们基于红黑树实现,能够自动对元素进行排序,并提供高效的插入、删除和查找操作。虽然功能相似,但两者在元素唯一性上有重要区别。
set 容器中存储的元素是唯一的,不允许重复。所有元素会按照默认升序自动排序(可自定义比较规则)。由于其底层是平衡二叉搜索树,插入、删除和查找的时间复杂度均为 O(log n)。
常用操作包括:
#include <set>
#include <iostream>
using namespace std;
int main() {
set<int> s;
s.insert(5);
s.insert(3);
s.insert(5); // 重复元素,插入失败
for (int x : s) {
cout << x << " "; // 输出:3 5
}
if (s.find(3) != s.end()) {
cout << "\n3 存在";
}
return 0;
}
multiset 与 set 最大的不同是允许重复元素。它同样保持元素有序,但相同值可以多次插入。
立即学习“C++免费学习笔记(深入)”;
适用于需要维护有序序列且允许重复的场景,例如统计频率、维护成绩排名等。
主要操作与 set 类似,但在查找和删除时需注意:
#include <set>
#include <iostream>
using namespace std;
int main() {
multiset<int> ms;
ms.insert(5);
ms.insert(3);
ms.insert(5);
cout << "5 出现次数:" << ms.count(5) << endl; // 输出 2
for (int x : ms) {
cout << x << " "; // 输出:3 5 5
}
return 0;
}
默认情况下,set 和 multiset 按升序排列。可通过提供比较函数或函数对象来自定义排序方式。
例如,让元素按降序排列:
struct greater_cmp {
bool operator()(const int& a, const int& b) const {
return a > b;
}
};
set<int, greater_cmp> s; // 降序 set
multiset<int, greater<int>> ms; // 使用标准库 greater
对于自定义类型(如结构体),必须定义严格弱序比较规则,否则插入时会出错。
关键在于是否允许重复元素:
两者都不支持通过下标访问,也不提供 front() 或 back() 方法(尽管可通过 begin() 和 rbegin() 间接获取首尾元素)。
基本上就这些。掌握 set 和 multiset 的区别与用法,能有效提升数据处理效率,特别是在需要有序且频繁查询的场景中。注意合理选择容器类型,避免误用导致逻辑错误。
以上就是C++集合set和multiset使用方法解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号