STL 之 set 集合

set 介绍

set 是一个容器,它其中所包含的元素的值是唯一的。集合中的元素按一定的顺序排列。具有快速查找功能,但是以牺牲插入和删除操作效率为代价的。set 可以在时间复杂度为 O(logN) 情况下插入、删除和查找数据。

(在STL中,set是以红黑树(RB-tree)作为底层数据结构。根节点是黑色;其他结点是红色或黑色;每个红色结点的左右必须是黑色;每条从叶子结点到根节点的路径都包含相同数目的黑色结点。)

注意:

  • (1) 不能直接改变元素值,那样会打乱原本正确的顺序;要改变元素值必须先删除旧元素,则插入新元素
  • (2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
  • (3) 元素比较只能用于类型相同的容器 (即元素和排序准则必须相同)

set 方法和使用
1. 创建 set 对象
  • set ();
    • set<int, less<int> > s1;  //创建一个空 set 对象,等价于 set<int> s;
      • less<int>是一个标准类,用于形成升序排列函数对象。降序排列是用 greater<int>。
    • set<int> s2(s1);  // 拷贝生成对象 s2
  • set (const key_compare& comp)
    • 指定一个比较函数对象 comp 来创建 set 对象
      • 例如:定义字符串比较函数对象 strLess
      • struct strLess  
      • {
      •   bool operator (const char * s1, const char * s2) const
      •     { return strcmp(s1, s2) < 0;}
      • }
      • set<const char*, strLess> s(strLess());  //创建空的set对象,元素类型char*,比较函数对象(即排序准则)为自定义strLess
  • (3) set (InputIterator frist, InputInterator last)
    • 用迭代器区间 [first, last) 来创建,例如:
      • int iArray[] = {11, 22, 33};
      • set<int> s(iArray, iArray+3);
  • (4) set (InputIterator frist, InputIterator last, const key_compare& comp)
    • 用迭代区间 [first, last) 所指的元素和 comp 函数创建对象,例如:
      • const char* Array = {"dog", 'cat', 'bird'};
      • set<const char *, strLess> s(Array, Array+3, strLess);
2. 元素的插入
  • (1) pair<iterator, bool> insert (const value_type &v)
    • 将元素 v 插入 set 容器,要求 v 值不与 set 容器的任何元素重复。否则插入失败,返回一个 pair 配对对象。
    • pair 对象定义举例:pair<set<int>::iterator, bool> p;
  • (2) iterator insert (iterator position, const value_type &v)
    • 将元素 v 插入 set 容器,参数 position 只是提示可在 position 位置插入 v,返回的插入位置依情况而定。
    • 如果希望提供一个是否插入成功的信息,可以使用 pair 对象的 insert 函数进行插入;或者也可以直接通过 s.insert(19).second == true 来判断插入成功。
      • set<int> s;
      • s.insert(10);
      • pair<set<int>>::iterator, bool> p=s.insert(19);
      • if (p.second)
      •   cout << "插入新元素" << *(p.first) << endl;
      • else
      •   cout << "已存在该元素,不重复插入" << endl
  • (3) void insert (InputIterator first, InputIterator last)
    • 将某迭代器区间所指的元素插入到 set 容器,不重复数据。
3. 元素的删除
  • (1) void erase (iterator position)
    • 删除 positon 所指的元素
  • (2) size_type erase (const key_type &k)
    • 删除等于 k 的那个元素。成功则返回 1
  • (3) void erase (iterator first, iterator last)
    • 删除 set 迭代器区间 [first, last) 上的所有元素
  • (4) void clear ()
    • 删除所有元素,但不会删除内部红黑树的头节点
4. 元素的遍历访问
  • (1) 正向遍历
    • iterator begin ()
    • iterator end ()
  • (2) 反向遍历
    • reverse_iterator rbegin ()
    • reverse_iterator rend ()
5. 元素的搜索
  • iterator find (const key_type &k) const
    • 返回索引为 x 的元素指针,没找到返回一个 end 结束元素位置
6. 其他常用函数
  • bool empty () const:
    • 判断 set 是否为空
  • size_type count (const key_type& x) const:
    • 返回键为 x 的元素个数
  • size_type size () const:
    • 返回容器中元素个数
  • void swap (set(const set &)):
    • 交换两个集合变量
  • equal_range ():
    • 找出键值等于某值的所有点,返回集合中与给定值相等的上下限的两个迭代器
  • pair<iterator, iterator>equal_range(const key_type& x)const;    
    • 返回一个迭代器对(指向键不小于x的第一个元素的迭代器,指向键大于x的第一个元素的迭代器)
  • iterator upper_bound (const value_type &v):
    • 找出 key >= v 的第一个结节点
  • iterator low_bound (const value_type &v) const:
    • 找出 key > v 的第一个结点
  • [lower_bound (v), uppper_bound(v)) 区间为等于 v 的所有点
参考资料:
  1. STL set 百度百科
  2. STL set 主要成员
  3. STL set 使用方法小结(含举例)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值