STL总结之set

介绍

set 是一个封装红黑树 (自平衡二叉树) 的关联容器,其中元素依据其值自动排序且每个元素仅能出现一次。
set 容器定义于头文件 <set>,其声明如下:

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class set;

set 容器是一个类

初始化

set 容器需要指定排序规则,有两种方式可指定:

  • 元素类型重载小于号运算符。
    strcut T {
     	…… // 各种参数
     	// 该函数声明必须这样写
     	friend bool operator <(const T& a,const T& b)
     	{
     		// check(a,b)为 a < b 成立条件
     		return check(a,b) ? true : false;
     	}
      };
    
  • 以 类型参数 定义,需要定义一个 函数对象。如 set<T,greater<T> >
    struct Cmp {
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    class Cmp {
    public:
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    // 这两个 Cmp 是等价的
    set<int,Cmp> s;
    

以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。

  • set<T> st;
    创建一个空的 set 容器。

    set<int> st;
    
  • set<T> st({num1,num2,……});
    创建一个以初值列元素为初值的 set 容器。

    set<int> st({0,1,2,3,8});
    
  • set<T> st = {num1,num2,……};
    创建一个以初值列元素为初值的 set 容器。

    set<int> st = {0,1,2,3,8};
    
  • set<T> st(st1);
    创建一个 st1 的同型拷贝 (所有元素都被复制)。

    set<int> st1 = {1,2,8,4};
    set<int> st(st1);
    ``
    
  • set<T> st = st1;
    创建一个 st1 的同型拷贝 (所有元素都被复制)。

    set<int> st1 = {1,2,8,4};
    set<int> st = st1;
    
  • set<T> st(begin_iterator,end_iterator)
    创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的 set 容器。

    set<int> st1 = {1,2,8,4};
    set<int> st(st1.begin(),st1.end());
    

修改

set 容器禁止修改元素内容。

查询

  • empty()
    判断 set 容器是否为空。
  • size()
    返回 set 容器中的元素个数。
  • max_size()
    返回 set 容器大小的理论极限值,即当前内存情况下,允许创建 set 容器中元素个数的最大可能值。
  • count(key)
    返回 set 容器中元素值为 key 的元素个数。在 set 容器中,返回值为 0 或 1。
  • find(key)
    判断 set 容器中是否存在元素值为 key 的元素,存在返回相应迭代器,否则返回 end()

比较

按照字典序列比较 set 中的值。

  • operator ==
  • operator !=
  • operator <
  • operator <=
  • operator >
  • operator >=
if(st == st1)
{
	cout << "st == st1" << endl;
}

增加

  • insert(value)
    set 容器中插入一个元素 value。
    其返回值为 pair<set<T>::iterator,bool>set<T>::iterator 指向插入元素位置的迭代器,bool 表示插入是否成功 (如果容器中存在该值,则会插入不成功)。
    set<int> st = {1,3,10,5,2,99,8};
    pair<set<int>::iterator,bool> result =  st.insert(1);
    
  • insert(begin_iterator,end_iterator)
    set 容器中插入迭代器区间 [start_iterator,end_iterator) 内的所有元素,元素可能插入不成功。无返回值。
    set<int> st = {1,3,10,5,2,99,8};
    set<int> st1 = {1,4,8,5};
    st.insert(st1.begin(),++(++st1.begin()));
    // 此时 st 容器元素依次为:1,2,3,4,5,8,10,99
    // 元素 1 插入失败,元素 4 插入成功
    

删除

  • clear()
    清空 set 容器。
  • erase(pos_iterator)
    移除 set 容器指定迭代器位置 pos_iterator 的元素。
    set<int> st = {1,3,10,5,2,99,8};
    st.erase(st.begin());
    // 此时 set 容器元素依次为:2,3,5,8,10,99
    
  • erase(begin_iterator,end_iterator)
    移除 set 容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。
    set<int> st = {1,3,10,5,2,99,8};
    st.erase(st.begin(),++(++st.begin()));
    // 此时 set 容器元素依次为:3,5,8,10,99
    
  • erase(value)
    移除 set 容器中元素值为 value 的元素 (如果存在的话)。返回值表示移除元素个数,在 set 容器中返回值只能为 0 或 1。

其他操作

  • equal_range(num)
    返回元素值等于 num 的迭代器区间。
    其返回值为 pair<set<T>::iterator,set<T>::iterator>set<T>::iterator指向第一个元素值等于 num 的迭代器位置,第二个set<T>::iterator 指向最后一个元素值等于 num 迭代器位置的下一个位置。
    set<int> st = {1,3,10,5,2,99,8};
    pair<set<int>::iterator,set<int>::iterator> result = st.equal_range(3);
    
  • lower_bound(num) / upper_bound(num)
    返回首个元素值 ≥ n u m \ge num num 的元素迭代器位置。
    返回首个元素值 &gt; n u m &gt; num >num 的元素迭代器位置。
    两者返回值刚好构成 equal_range() 的返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值