当前位置: 首页 > news >正文

std::set

std::set是C++标准库中的一个关联容器,它基于红黑树实现。std::set用于存储唯一的元素,并且这些元素会根据键的顺序自动排序。与std::map不同,std::set只存储键,而不存储键值对。

std::set的特性:

  • 唯一元素:std::set中的元素是唯一的,不允许有重复的元素
  • 自动排序:元素根据键的顺序自动排序,通常是按照键的升序排列
  • 模板类:std::set是一个模板类,可以存储任何可比较类型的元素

std::set提供了一系列成员函数来操作对象:

  • 构造函数

    • std::set():默认构造一个空的集合

    • std::set(const std::set& other):拷贝构造函数,深拷贝

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化
      for (auto value : my_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }std::set<int> new_set(my_set);  // 拷贝构造,深拷贝
      for (auto value : new_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }
      for (auto value : my_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }std::set<int> new_set(std::move(my_set));  // 移动构造
      for (auto value : new_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }
      std::cout << my_set.size() << std::endl;  // 0
      
  • 赋值操作

    • 赋值运行符 =:将一个set的内容复制给另一个set

    • swap(std::set& other):交换两个set的内容

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化
      std::set<int> new_set = my_set;  // 创建新的set对象,将my_set的内容赋给new_set
      for (auto value : new_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }std::set<int> swap_set = {2, 8, 6, 4};
      my_set.swap(swap_set);  // 交换两个set的内容
      for (auto value : my_set) {std::cout << value << std::endl;  // 2 4 6 8
      }
      for (auto value : swap_set) {std::cout << value << std::endl;  // 1 3 5 7 9
      }
      
  • 访问元素/迭代器

    • begin():返回指向第一个元素的迭代器

    • end():返回指向尾后一位的迭代器

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化auto it = my_set.begin();  // 返回指向第一个元素的迭代器
      std::cout << *it << std::endl;  // 1for (auto it = my_set.begin(); it != my_set.end(); it++) {std::cout << *it << std::endl;  // 1 3 5 7 9
      }
      
  • 查找元素

    • find(const key_type& k):查找指定键的元素

    • count(const key_type& k):返回指定键的元素数量(总是0或1)

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化std::cout << my_set.count(3) << std::endl;  // 1
      std::cout << my_set.count(4) << std::endl;  // 0
      
  • 插入元素

    • insert(const value_type& v):插入一个元素

    • emplace(Args&&… args):就地构造一个元素,避免额外的复制或移动

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化my_set.insert(4);  // 插入一个元素
      my_set.emplace(6);  // 就地构造一个元素插入
      my_set.insert({ 8, 2 });  // 插入多个元素
      for (auto value : my_set) {std::cout << value << std::endl;  // 1 2 3 4 5 6 7 8 9
      }
      
  • 删除元素

    • erase(const key_type& k):删除指定键的元素

      std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化my_set.erase(3);  // 删除键为3的元素
      for (auto value : my_set) {std::cout << value << std::endl;  // 1 5 7 9
      }my_set.erase(my_set.begin(), --my_set.end());  // 删除某一范围内的元素
      for (auto value : my_set) {std::cout << value << std::endl;  // 9
      }
      
  • 容量

    • empty():检查集合是否为空

    • size():返回集合中元素的数量

    std::set<int> my_set{7, 5, 1, 3, 9};  // 创建set对象,并进行初始化bool is_empty = my_set.empty();  // 判断集合是否为空
    std::cout << is_empty << std::endl;  // 不为空,返回0std::cout << my_set.size() << std::endl;  // 5
    

http://www.mrgr.cn/news/42241.html

相关文章:

  • vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?
  • 毕业设计选题:基于ssm+vue+uniapp的电子点餐系统小程序
  • 信息安全工程师(32)认证技术方法
  • 拉普拉斯频域滤波器与高斯高通滤波器等价
  • 信息安全工程师(31)认证类型与认证过程
  • 【社保通-注册安全分析报告-滑动验证加载不正常导致安全隐患】
  • vue-cli老项目继续优化:json压缩神器 compress-json
  • 【ShuQiHere】深入理解 LC-3 的输入输出机制(I/O Mechanism)
  • C 语言预处理详解:从宏替换到条件编译
  • SSY20241002提高组T4题解__纯数论
  • JavaScript 数组方法
  • esp32开发环境搭建和烧录测试
  • 鸿蒙 HarmonyNext 与 Flutter 的异同之处
  • Linux 6.11版本发布
  • 大模型笔记05--coze经典案例分析
  • King of Range 2024牛客国庆集训派对day3
  • SQL学习3
  • Prompt 初级版:构建高效对话的基础指南
  • 计算机毕业设计 基于Python的个性化旅游线路推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • MySQL 中的 GTID 复制详解