STL之set

set

s e t set set集合是 C + +    S T L C++~~ STL C++  STL库中自带的一个容器, s e t set set具有以下两个特点:

  • s e t set set中的元素都是排好序的

  • s e t set set集合中没有重复的元素

常用操作:
set<int> s;

s.begin();    	  //返回set容器的第一个元素的地址

s.end();       //返回set容器的最后一个元素地址

s.clear();    	   //删除set容器中的所有的元素

s.empty();     //判断set容器是否为空

s.max_size();    //返回set容器可能包含的元素最大个数

s.size();       //返回当前set容器中的元素个数

s.erase(it); 			 //删除迭代器指针it处元素

s.erase(begin,end); 		//删除迭代器区间[begin,end]的元素

s.erase(int x); 		//删除set中值为x的元素

s.insert(a); 			 //插入某个元素 
查找函数

s e t set set的查找函数有两个, c o u n t ( ) count() count() f i n d ( ) find() find()

  • c o u n t ( ) count() count() : 用来查找 s e t set set中某个元素出现的次数。这个函数在 s e t set set并不是很实用,因为一个键值在 s e t set set只可能出现 0 0 0 1 1 1次,这样就变成了判断某一键值是否在 s e t set set出现过了

  • f i n d ( ) find() find(): 用来查找 s e t set set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s . e n d ( ) s.end() s.end() (最后一个元素的下一个位置, s s s s e t set set的变量名)

遍历数据

用迭代器遍历数据:

for(set<int>::iterator it = s.begin(); it != s.end(); it++){
	cout<<*it<<endl;    
}
二分查找函数

由于 s e t set set的元素是排好序的,那么一些问题中,如果需要查找很多区间的最大(小)值,那么我们可以直接调用 s e t set set,每次对当前加入 s e t set set元素二分查找即可

lower_bound(val)

s e t set set中查找大于或等于 v a l val val的第一个元素,并返回其迭代器位置,如果没有找到则返回 s e t . e n d ( ) set.end() set.end()

set<int> s;
for(int i=1;i<10;i++) s.insert( (i>>4)*20%74 );
auto ans=s.lower_bound(20);
if(ans!=s.end()) cout<<"success"<<endl;
else cout<<"fail"<<endl;

upper_bound(val)

s e t set set中查找大于 v a l val val的第一个元素,并返回其迭代器位置,如果没有找到则返回 s e t . e n d ( ) set.end() set.end()

set<int> s;
for(int i=1;i<10;i++) s.insert( (i>>4)*20%74 );
auto ans=s.upper_bound(20);
if(ans!=s.end()) cout<<"success"<<endl;
else cout<<"fail"<<endl;

unordered_set

u n o r d e r e d _ m a p unordered\_map unordered_map一样, u n o r d e r e d _ s e t unordered\_set unordered_set内部实现也是哈希表,因此数据插入和查找时间复杂度很低,但是缺陷是 u n o r d e r e d _ s e t unordered\_set unordered_set无法实现元素的排序功能,但是仍然是不可重复的元素集合(因为哈希函数的原因)

常用操作

实际上和 s e t set set几乎一样的

unordered_set<int> s;

s.begin();    	  //返回set容器的第一个元素的地址

s.end();       //返回set容器的最后一个元素的下一个元素的地址

s.clear();     //删除set容器中的所有的元素

s.empty();     //判断set容器是否为空

s.max_size();    //返回set容器可能包含的元素最大个数

s.size();       //返回当前set容器中的元素个数

s.erase(iterator it); 		//删除迭代器指针it处元素

s.erase(begin,end); 		//删除迭代器区间[begin,end]的元素

s.erase(int x); 		//删除set中值为x的元素

s.insert(a); 			 //插入某个元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值