使用之前包含头文件 #include<set>

定义一个集合:和其他的容器类似 set<int> S; 这行代码就构造了一个空的集合S;
或者使用内部默认的构造函数 set<int> S = {3, 2, 1, 4, 5}; 用一个列表来给空的集合S来赋值,此时集合内部的抽象形式应该是如下图所示的:

集合S的状态

insert() 操作:

使用S.insert(1); 表示往集合里面插入一个元素1 由于集合的元素不能重复,所以插入相当于无效
使用S.insert(7); 表示往集合里面插入一个元素7

集合S的状态

find()操作

find函数会返回集合元素在集合中的位置,如果没有找到元素,则会返回end位置
auto iter = S.find(0); 因为当前集合里面没有0元素,所以此时iter就是S.end()

begin()操作和end()操作

begin操作会返回集合中的最小元素,end操作则是集合中最大元素的后一位,为前闭后开的区间

erase()操作

erase操作表示从集合中删除一个元素

代码展示

#include <iostream>
#include <set>
using namespace std;
int main()
{
  set<int> S = {3, 2, 1, 4, 5};   //集合的初始状态

  // 插入.
  S.insert(1);
  S.insert(7);

  // 查找与删除.
  auto iter = S.find(0);    
  if (iter != S.end())
    S.erase(iter);
  iter = S.find(5);
  if (iter != S.end())
    S.erase(iter);
  S.erase(5);

  // 迭代器位置.
  iter = S.begin();
  cout << *iter << endl;
  ++iter;    //当前元素位置的下一个位置(按照排好序的位置)
  cout << *iter << endl;
  --iter;    //当前元素位置的上一个位置(也是排好序的位置)
  cout << *iter << endl;

  // 遍历集合, 为简便计我们不讨论常量迭代器.
  for (auto iter = S.begin(); iter != S.end(); ++iter)  //从头遍历到尾,也就是从最小元素遍历到最大元素
    cout << *iter << ' ';
  cout << endl;
  for (auto riter = S.rbegin(); riter != S.rend(); ++riter)  //表示逆序遍历,r表示逆序,也就是从最大元素遍历到最小元素
    cout << *riter << ' ';
  cout << endl;

  for (const auto& x : S)  //基于范围的for循环写法,每次从S中取出一个元素赋值给x,然后将x输出
    cout << x << ' ';
  cout << endl;
  
  return 0;
}

立志成为一名攻城狮
最后更新于 2020-01-02