<set>
数据结构
<set>
是 C++ 标准库中的一个关联容器,用于存储唯一的元素集合,并自动按照特定的排序准则进行排序。std::set
是一个基于红黑树(或其他平衡二叉搜索树)的集合类模板,确保集合中的元素是唯一的,并提供高效的元素查找、插入和删除操作。
1. 类介绍
std::set
是一个关联容器,具有以下主要特性:
- 唯一性:集合中的每个元素都是唯一的。
- 排序:集合中的元素按照升序排列(或按照自定义的排序准则)。
- 自动平衡:元素插入和删除操作保持集合的平衡,确保高效的查找操作。
- 高效操作:插入、删除和查找操作的时间复杂度为 O(log n)。
2. 基本操作
创建和初始化:
#include <iostream>
#include <set>
int main() {
// 创建一个空的 std::set
std::set<int> s1;
// 使用初始化列表创建 std::set
std::set<int> s2 = {1, 2, 3, 4, 5};
// 使用自定义排序准则创建 std::set
std::set<int, std::greater<int>> s3 = {5, 4, 3, 2, 1};
return 0;
}
插入元素:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3};
// 插入单个元素
s.insert(4);
// 插入多个元素
s.insert({5, 6, 7});
// 尝试插入重复元素(不会插入)
auto result = s.insert(4);
if (!result.second) {
std::cout << "Element 4 already exists" << std::endl;
}
// 输出集合中的元素
for (const auto& elem : s) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
查找元素:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4, 5};
// 查找元素
auto it = s.find(3);
if (it != s.end()) {
std::cout << "Element found: " << *it << std::endl;
} else {
std::cout << "Element not found" << std::endl;
}
// 使用 count() 检查元素是否存在
if (s.count(5)) {
std::cout << "Element 5 exists in the set" << std::endl;
}
return 0;
}
删除元素:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4, 5};
// 删除单个元素
s.erase(3);
// 删除范围内的元素
s.erase(s.find(4), s.end());
// 输出集合中的元素
for (const auto& elem : s) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
访问元素:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4, 5};
// 使用范围-based for 循环访问元素
for (const auto& elem : s) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用迭代器访问元素
for (auto it = s.begin(); it != s.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
大小和容量:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4, 5};
// 获取集合大小
std::cout << "Size of set: " << s.size() << std::endl;
// 检查集合是否为空
std::cout << "Is set empty? " << (s.empty() ? "Yes" : "No") << std::endl;
return 0;
}
排序和范围操作:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4, 5};
// 输出集合中的元素(已排序)
std::cout << "Set elements: ";
for (const auto& elem : s) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 查找范围内的元素
auto it1 = s.lower_bound(2);
auto it2 = s.upper_bound(4);
std::cout << "Elements in range [2, 4): ";
for (auto it = it1; it != it2; ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
3. 总结
std::set
提供了一种高效的方式来存储和管理唯一的元素集合,并自动按照特定的排序准则进行排序。它支持高效的查找、插入和删除操作,适用于需要确保元素唯一性和排序的场景。通过使用 std::set
,可以实现集合操作的灵活性和高效性。