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 使用方法小结(含举例)
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 使用方法小结(含举例)
相关文章推荐
- L2-005. 集合相似度_STL的 set
- C++中STL容器的分类和基本功能(二):集合(set) 映射(map)
- STL之set集合容器
- stl的集合set——安迪的第一个字典(摘)
- C++ STL 有关于SET集合部分 的自定义数据类型的排序 以及 pair的使用
- PTA 7-9 集合相似度(STL之set初体验)
- C++STL_set中函数_集合运算
- STL(十一)set集合容器
- STL之set集合容器 【转】
- STL---set基本使用--取集合的交、并、差、对称差
- STL泛型编程-set集合容器
- STL-set (集合)之删除元素
- STL_集合_【set】
- 单词数 (STL set集合)
- STL:集合#include <set>
- STL关联式容器之集合set
- C++的STL中集合(set)的使用说明
- STL集合容器set按照由小到大或者由大到小的顺序存放元素
- STL之set集合容器
- 关于集合set ---STL