C++ std::set
1. 什么是 std::set
?
std::set
是 C++ 标准库提供的一种关联容器,用于存储唯一的元素并且根据元素的大小自动排序。set
中的元素按照升序(默认)或自定义的顺序进行排列,并且每个元素在 set
中是唯一的,不能重复。
2. std::set
的特点
- 自动排序:
set
会根据元素的值进行自动排序,默认为升序排列,也可以自定义排序规则。 - 唯一性:
set
中的元素是唯一的,不能重复插入相同的元素。 - 不支持索引访问:与
vector
或list
不同,set
不支持通过下标访问元素,只能通过迭代器遍历。 - 高效查找:
set
采用平衡二叉树(如红黑树)实现,具有 O(log n) 的查找、插入和删除操作的时间复杂度。
3. std::set
常用操作
操作 | 描述 |
---|---|
insert() |
插入一个元素,如果元素已存在则不会插入。 |
find() |
查找指定元素,返回指向该元素的迭代器,若找不到则返回 end() 。 |
count() |
查找指定元素是否存在,返回元素出现的次数(对于 set 来说,最多为 1)。 |
erase() |
删除指定元素或指定范围内的元素。 |
size() |
返回 set 中的元素数量。 |
empty() |
检查 set 是否为空。 |
begin() |
返回指向第一个元素的迭代器。 |
end() |
返回指向最后一个元素之后位置的迭代器。 |
lower_bound() |
返回指向第一个 不小于 指定值的元素的迭代器。 |
upper_bound() |
返回指向第一个 大于 指定值的元素的迭代器。 |
4. std::set
示例代码
#include <iostream>
#include <set>
using namespace std;
int main() {
// 创建一个 set,存储整数
set<int> s;
// 插入元素
s.insert(10);
s.insert(20);
s.insert(15);
s.insert(10); // 插入重复元素不会生效
// 输出 set 的大小
cout << "Size of set: " << s.size() << endl;
// 查找元素 15 是否存在
if (s.find(15) != s.end()) {
cout << "15 exists in the set." << endl;
} else {
cout << "15 does not exist in the set." << endl;
}
// 查找元素 25 是否存在
if (s.find(25) != s.end()) {
cout << "25 exists in the set." << endl;
} else {
cout << "25 does not exist in the set." << endl;
}
// 使用 count 检查元素是否存在
if (s.count(20)) {
cout << "20 exists." << endl;
}
// 使用 lower_bound 查找第一个大于或等于 15 的元素
auto it = s.lower_bound(15);
if (it != s.end()) {
cout << "Lower bound of 15: " << *it << endl;
}
// 输出 set 中的元素
cout << "Elements in set: ";
for (const auto& elem : s) {
cout << elem << " ";
}
cout << endl;
// 删除元素 20
s.erase(20);
// 输出删除后的 set
cout << "After erase(20), elements in set: ";
for (const auto& elem : s) {
cout << elem << " ";
}
cout << endl;
// 清空 set
s.clear();
if (s.empty()) {
cout << "The set is now empty." << endl;
}
return 0;
}
5. 代码解析
插入元素:
s.insert(10);
s.insert(20);
s.insert(15);
s.insert(10); // 插入重复元素不会生效
使用
insert
向set
中插入元素。如果插入的元素已存在,set
不会插入该元素,因此每个元素在set
中是唯一的。查找元素:
if (s.find(15) != s.end()) {
cout << "15 exists in the set." << endl;
}
使用
find
查找指定元素,返回一个迭代器指向找到的元素,如果找不到,则返回end()
。使用
count
检查元素是否存在:if (s.count(20)) {
cout << "20 exists." << endl;
}
使用
count
检查元素是否存在。对于set
,count
要么返回 0(元素不存在),要么返回 1(元素存在)。使用
lower_bound
查找第一个不小于指定值的元素:auto it = s.lower_bound(15);
if (it != s.end()) {
cout << "Lower bound of 15: " << *it << endl;
}
lower_bound
返回一个指向第一个不小于指定值的元素的迭代器。如果没有找到合适的元素,则返回end()
。遍历
set
:for (const auto& elem : s) {
cout << elem << " ";
}
使用范围基
for
循环遍历set
中的元素。由于set
是自动排序的,遍历时的顺序是升序排列。删除元素:
s.erase(20);
使用
erase
删除指定元素。如果指定元素存在,它会从set
中移除。清空
set
:s.clear();
if (s.empty()) {
cout << "The set is now empty." << endl;
}
使用
clear
清空set
中的所有元素。使用empty
检查set
是否为空。
6. 小结
std::set
是一个有序的集合容器,元素在set
中是唯一且自动排序的。- 常用操作包括插入、查找、删除、遍历以及查找指定位置的元素(如使用
lower_bound
和upper_bound
)。 set
提供了高效的查找和插入操作,适用于需要按顺序存储并去重的场景。