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<int, less<int> > s1; //创建一个空 set 对象,等价于 set<int> s;
- 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
- 指定一个比较函数对象 comp 来创建 set 对象
- (3) set (InputIterator frist, InputInterator last)
- 用迭代器区间 [first, last) 来创建,例如:
- int iArray[] = {11, 22, 33};
- set<int> s(iArray, iArray+3);
- 用迭代器区间 [first, last) 来创建,例如:
- (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);
- 用迭代区间 [first, last) 所指的元素和 comp 函数创建对象,例如:
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 的所有点