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;// 删除元素 20s.erase(20);// 输出删除后的 setcout << "After erase(20), elements in set: ";for (const auto& elem : s) {cout << elem << " ";}cout << endl;// 清空 sets.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提供了高效的查找和插入操作,适用于需要按顺序存储并去重的场景。
