std::set 是 C++ 标准库中的一个容器,用于存储唯一的元素,而且元素会按照肯定的次序(默认是升序)自动排序。它基于红黑树(一种自均衡二叉搜刮树)实现,因此插入、删除和查找操纵的时间复杂度均为 O(log n)。
1. 头文件
使用 std::set 需要包含头文件:
2. 定义和初始化
- std::set<int> s1; // 定义一个空的 set,存储 int 类型元素
- std::set<std::string> s2 = {"apple", "banana", "cherry"}; // 初始化 set
- std::set<double> s3(s2.begin(), s2.end()); // 通过迭代器初始化
复制代码 3. 插入元素
使用 insert 方法插入元素。如果元素已经存在,则不会重复插入。
- std::set<int> s;
- s.insert(10); // 插入元素 10
- s.insert(20); // 插入元素 20
- s.insert(10); // 不会插入,因为 10 已经存在
复制代码 4. 删除元素
使用 erase 方法删除元素。
- s.erase(10); // 删除值为 10 的元素
- s.erase(s.begin()); // 删除第一个元素
- s.erase(s.begin(), s.end()); // 删除所有元素
复制代码 5. 查找元素
使用 find 方法查找元素。如果找到,返回指向该元素的迭代器;否则返回 end()。
- auto it = s.find(20);
- if (it != s.end()) {
- std::cout << "Element found: " << *it << std::endl;
- } else {
- std::cout << "Element not found" << std::endl;
- }
复制代码 6. 遍历元素
可以使用迭代器遍历 set 中的元素。
- for (auto it = s.begin(); it != s.end(); ++it) {
- std::cout << *it << " ";
- }
复制代码 大概使用范围 for 循环:
- for (const auto& elem : s) {
- std::cout << elem << " ";
- }
复制代码 7. 判断是否为空
使用 empty 方法检查 set 是否为空。
- if (s.empty()) {
- std::cout << "Set is empty" << std::endl;
- }
复制代码 8. 获取元素个数
使用 size 方法获取 set 中元素的个数。
- std::cout << "Size of set: " << s.size() << std::endl;
复制代码 9. 清空 set
使用 clear 方法清空 set。
10. 自定义排序规则
set 默认按升序排序,但可以通过自定义比力函数来改变排序规则。
- struct Compare {
- bool operator()(int a, int b) const {
- return a > b; // 降序排序
- }
- };
- std::set<int, Compare> s = {10, 20, 30};
- for (const auto& elem : s) {
- std::cout << elem << " "; // 输出: 30 20 10
- }
复制代码 11. 其他常用方法
- count:返回某个元素的个数(对于 set,只能是 0 或 1)。
- if (s.count(20)) {
- std::cout << "Element 20 exists" << std::endl;
- }
复制代码 - lower_bound:返回第一个大于或等于某个值的迭代器。
- auto it = s.lower_bound(15);
- if (it != s.end()) {
- std::cout << "Lower bound of 15: " << *it << std::endl;
- }
复制代码 - upper_bound:返回第一个大于某个值的迭代器。
- auto it = s.upper_bound(15);
- if (it != s.end()) {
- std::cout << "Upper bound of 15: " << *it << std::endl;
- }
复制代码 12. set 的特性
- 唯一性:set 中的元素是唯一的,不答应重复。
- 自动排序:元素会按照指定的排序规则自动排序。
- 高效查找:基于红黑树实现,查找、插入和删除的时间复杂度为 O(log n)。
- 不可修改元素:set 中的元素是只读的,不能直接修改。如果需要修改,必须先删除旧元素,再插入新元素。
13. set 的应用场景
- 需要存储唯一元素的场景。
- 需要自动排序的场景。
- 需要频繁查找、插入和删除的场景。
14. 示例代码
以下是一个完整的示例,展示了 set 的常见用法:
- #include <iostream>#include <set>
- int main() { std::set<int> s = {10, 20, 30}; // 插入元素 s.insert(40); s.insert(20); // 不会插入,因为 20 已经存在 // 遍历元素 std::cout << "Set elements: "; for (const auto& elem : s) { std::cout << elem << " "; // 输出: 10 20 30 40 } std::cout << std::endl; // 查找元素 auto it = s.find(20); if (it != s.end()) { std::cout << "Element 20 found" << std::endl; } // 删除元素 s.erase(30); // 判断是否为空 if (!s.empty()) { std::cout << "Set is not empty, size: " << s.size() << std::endl; } return 0;}
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |