您的位置:首页 > 其它

STL 之 set 集合

2013-12-26 16:31 183 查看
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 的所有点

参考资料:

STL set 百度百科
STL set 主要成员
STL set 使用方法小结(含举例)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: