浅谈C++|STL之set篇

07-21 1040阅读

浅谈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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]