一、set的特点
关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。
主要特点:
(1)map和set的插入删除效率比用其他序列容器高
(2)每次insert之后,以前保存的iterator不会失效
(3)当数据元素增多时,set的插入和搜索速度变化不大
二、set的用法
1.set的定义和初始化
- swap()–交换两个集合变量
2.set的状态
- empty(); // 如果集合为空,返回true
- count(); // 返回某个值元素的个数
用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了 - max_size()–返回集合能容纳的元素的最大限值
- size()–集合中元素的数目
3.插入和访问
set不支持随机访问!因此*(s.begin+1)这种操作都是非法的,只能通过迭代器移动来访问
- insert()–在集合中插入元素
insert(key_value); 将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
3.遍历
- begin(); // 返回指向第一个元素的迭代器
- end(); // 返回指向最后一个元素的迭代器
- rbegin()–返回指向集合中最后一个元素的反向迭代器
- rend()–返回指向集合中第一个元素的反向迭代器
4.删除
- clear(); // 清除所有元素
- erase()–删除集合中的元素
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
5.查找
- count(); // 返回某个值元素的个数
- find()–返回一个指向被查找到元素的迭代器
返回给定值值得定位器,如果没找到则返回end()。