set C++标准库STL的使用方法(存储唯一元素)
std::set 是 C++ 标准库中的一个容器,用于存储唯一的元素,而且元素会按照肯定的次序(默认是升序)自动排序。它基于红黑树(一种自均衡二叉搜刮树)实现,因此插入、删除和查找操纵的时间复杂度均为 O(log n)。1. 头文件
使用 std::set 需要包含头文件:
#include <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。
s.clear();
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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]