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;  // 1
      
      for (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;  // 不为空,返回0
    
    std::cout << my_set.size() << std::endl;  // 5
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值