浅谈C++|STL之set篇

2024-07-21 1041阅读

浅谈C++|STL之set篇

一.set

1.1set基本概念

特点:

所有元素在插入时,会自动排序,并且不能插入重复元素。

本质:

set/multiset属于关联式容器,底层是红黑树。

set/multiset区别

1.set不允许容器中有重复的元素

2.multiset允许容器中有重复的元素

1.2set构造和赋值

  1. 构造set容器:

    • 默认构造函数:std::set set_name;
    • 区间构造函数:std::set set_name(iterator_begin, iterator_end);
    • 拷贝构造函数:std::set set_name(another_set);
    • 拷贝构造函数(部分元素):std::set set_name(another_set, iterator_begin, iterator_end);
    • 赋值操作:

      • 拷贝赋值:set_name = another_set;
      • 移动赋值(自C++11起):set_name = std::move(another_set);
      • 重载 = :std::set set_name = another_set;

其中,Type是set中存储的元素类型。需要注意的是,set中的元素默认按照升序进行排序,并且所有元素都是唯一的。如果需要自定义排序规则或元素比较函数,可以使用带有自定义比较函数的构造函数和赋值操作符。

以下是一些示例代码:

// 构造set容器
std::set mySet1;  // 默认构造函数
int arr[] = {1, 2, 3, 4, 5};
std::set mySet2(arr, arr + 5);  // 区间构造函数,指针也可
std::set anotherSet = mySet2;  // 拷贝构造函数
// 赋值操作
std::set mySet3;
mySet3 = anotherSet;  // 拷贝赋值
std::set mySet4;
mySet4 = std::move(anotherSet);  // 移动赋值
构造函数示例
默认构造函数std::set set_name;
区间构造函数std::set set_name(begin, end);
拷贝构造函数std::set set_name(another_set);
拷贝构造函数(部分元素)std::set set_name(another_set, iterator_begin, iterator_end);
赋值操作示例
拷贝赋值set_name = another_set;
移动赋值(自C++11起)set_name = std::move(another_set);

1.3set大小和交换

在STL中,set(或者其他关联容器)具有以下两个常用的成员函数来获取容器的大小以及交换容器内容:

  1. 大小操作:

    • size():返回容器中元素的个数。
    • empty():检查容器是否为空,如果为空则返回true,否则返回false。
    • 交换操作:

      • swap():将当前容器的内容与另一个容器进行交换。

以下是使用示例:

#include 
#include 
int main() {
  std::set mySet = {1, 2, 3, 4, 5};
  // 大小操作
  std::cout 
      std::cout 
      std::cout 10, 20, 30};
  mySet.swap(anotherSet);
  std::cout 
      std::cout 
      std::cout 
  std::set5, 6, 7};
  mySet.insert(anotherSet.begin(), anotherSet.end());
  // 删除操作
  mySet.erase(3);
  mySet.erase(mySet.find(4));
  mySet.erase(mySet.begin(), mySet.find(5));
  mySet.clear();
  return 0;
}

  std::set1, 2, 3, 4, 5};
  // 查找操作
  int count = mySet.count(3);
  std::cout 
    std::cout 
    std::cout 
  std::set1, 2, 3};
  auto result = mySet.insert(4);
  if (result.second) {
    std::cout 
    std::cout 
    std::cout 
    std::cout 
  bool operator()(int a, int b) const {
    return a  b;  // 降序排序
  }
};
int main() {
  std::set5, 2, 7, 1, 9};
  // 打印排序后的set容器内容
  for (const auto& elem : mySet) {
    std::cout 
  std::string name;
  int age;
  // 通过重载 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]