set C++标准库STL的使用方法(存储唯一元素)

打印 上一主题 下一主题

主题 969|帖子 969|积分 2907

std::set 是 C++ 标准库中的一个容器,用于存储唯一的元素,而且元素会按照肯定的次序(默认是升序)自动排序。它基于红黑树(一种自均衡二叉搜刮树)实现,因此插入、删除和查找操纵的时间复杂度均为 O(log n)

1. 头文件

使用 std::set 需要包含头文件:
  1. #include <set>
复制代码

2. 定义和初始化

  1. std::set<int> s1; // 定义一个空的 set,存储 int 类型元素
  2. std::set<std::string> s2 = {"apple", "banana", "cherry"}; // 初始化 set
  3. std::set<double> s3(s2.begin(), s2.end()); // 通过迭代器初始化
复制代码

3. 插入元素

使用 insert 方法插入元素。如果元素已经存在,则不会重复插入。
  1. std::set<int> s;
  2. s.insert(10); // 插入元素 10
  3. s.insert(20); // 插入元素 20
  4. s.insert(10); // 不会插入,因为 10 已经存在
复制代码

4. 删除元素

使用 erase 方法删除元素。
  1. s.erase(10); // 删除值为 10 的元素
  2. s.erase(s.begin()); // 删除第一个元素
  3. s.erase(s.begin(), s.end()); // 删除所有元素
复制代码

5. 查找元素

使用 find 方法查找元素。如果找到,返回指向该元素的迭代器;否则返回 end()。
  1. auto it = s.find(20);
  2. if (it != s.end()) {
  3.     std::cout << "Element found: " << *it << std::endl;
  4. } else {
  5.     std::cout << "Element not found" << std::endl;
  6. }
复制代码

6. 遍历元素

可以使用迭代器遍历 set 中的元素。
  1. for (auto it = s.begin(); it != s.end(); ++it) {
  2.     std::cout << *it << " ";
  3. }
复制代码
大概使用范围 for 循环:
  1. for (const auto& elem : s) {
  2.     std::cout << elem << " ";
  3. }
复制代码

7. 判断是否为空

使用 empty 方法检查 set 是否为空。
  1. if (s.empty()) {
  2.     std::cout << "Set is empty" << std::endl;
  3. }
复制代码

8. 获取元素个数

使用 size 方法获取 set 中元素的个数。
  1. std::cout << "Size of set: " << s.size() << std::endl;
复制代码

9. 清空 set

使用 clear 方法清空 set。
  1. s.clear();
复制代码

10. 自定义排序规则

set 默认按升序排序,但可以通过自定义比力函数来改变排序规则。
  1. struct Compare {
  2.     bool operator()(int a, int b) const {
  3.         return a > b; // 降序排序
  4.     }
  5. };
  6. std::set<int, Compare> s = {10, 20, 30};
  7. for (const auto& elem : s) {
  8.     std::cout << elem << " "; // 输出: 30 20 10
  9. }
复制代码

11. 其他常用方法



  • count:返回某个元素的个数(对于 set,只能是 0 或 1)。
    1. if (s.count(20)) {
    2.     std::cout << "Element 20 exists" << std::endl;
    3. }
    复制代码
  • lower_bound:返回第一个大于或等于某个值的迭代器。
    1. auto it = s.lower_bound(15);
    2. if (it != s.end()) {
    3.     std::cout << "Lower bound of 15: " << *it << std::endl;
    4. }
    复制代码
  • upper_bound:返回第一个大于某个值的迭代器。
    1. auto it = s.upper_bound(15);
    2. if (it != s.end()) {
    3.     std::cout << "Upper bound of 15: " << *it << std::endl;
    4. }
    复制代码

12. set 的特性



  • 唯一性:set 中的元素是唯一的,不答应重复。
  • 自动排序:元素会按照指定的排序规则自动排序。
  • 高效查找:基于红黑树实现,查找、插入和删除的时间复杂度为 O(log n)。
  • 不可修改元素:set 中的元素是只读的,不能直接修改。如果需要修改,必须先删除旧元素,再插入新元素。

13. set 的应用场景



  • 需要存储唯一元素的场景。
  • 需要自动排序的场景。
  • 需要频繁查找、插入和删除的场景。

14. 示例代码

以下是一个完整的示例,展示了 set 的常见用法:
  1. #include <iostream>#include <set>
  2. 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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表