#include <iostream>
#include <vector>
#include <set>//set底层实现是红黑树 set和multiset 内部实现都是相同的

using namespace std;

int main(){
    // set头文件里有两种不同的容器
    set<int> a;//set里不能包含重复元素 元素不能重复 如果插入重复元素的话 就会忽略掉这个操作
    multiset<int> b;//元素可以重复 这里面可以插入两个1 三个1 都是可以的
    
    
    
    
    set<int>::iterator it = a.begin();
    // it++;//++指有序序列里的下一个元素 --指有序序列里的前一个元素 --it和++it也是有的
    
    //和vector一样有end迭代器 表示迭代器最后元素的后一个位置
    a.end();
    
    a.insert(x);//表示插入一个x
    a.find(x);//指查找一个x 他会返回值等于x的一个迭代器 如果没找到x的话 他的值会返回a.end();
    //所以我们可以根据这个判断x是否在a里面存在
    
    // if(a.find(x) == a.end())//判断x在a中是否存在 但是一般判断不这么写 会用后面一个函数
    
    a.lower_bound(x);
    //找到大于等于x的最小的元素迭代器
    a.upper_bound(x);
    //找到大于x的最小的元素迭代器 注意!!!是大于 不是小于 不要用字面意思理解
    
    a.erase(it);//指把it的所有迭代器全部删掉
    
    a.count(x);//表示的是x在a里面的个数//因为set里面不能重复 如果重复会忽略所以如果x存在返回1 如果x不存在返回0 返回个数草泥马小伙子误人子弟啊
    
    //当然也可以定义一个结构体 用结构体定义一个set
    //因为set里面是需要做比较的,所以我们也是需要去重载一个小于号的
    struct Rec{
        int x, y;
        bool operator< (const Rec& t) const{
            return x < t.x;
        }
    };
    
    set<Rec> c;//定义结构体
    //size/empty/clear 和vector类似
    //set支持迭代器 也是支持++ --两个宇算数相关的操作 set里的++--比较复杂 其实是找有序序列的下一个元素 在一个alpha树里他是找当前点的前驱或者后继 也可以理解为找有序序列的前一个元素或者后一个元素
}