STL set

set是一个集合内部使用红黑树的原理默认从小到大进行排序

map和set封装了二叉树等

在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。

注意:

1、set中的元素都是排好序的

2、set集合中没有重复的元素

lower_bound(key_value) ,返回第一个大于等于key_value的定位器

upper_bound(key_value),返回最后一个大于等于key_value的定位器

示例代码:

 
  1. #include <iostream>

  2. #include <set>

  3. using namespace std;

  4. int main()

  5. {

  6. set<int> s;

  7. s.insert(1);

  8. s.insert(3);

  9. s.insert(4);

  10. cout<<*s.lower_bound(2)<<endl;

  11. cout<<*s.lower_bound(3)<<endl;

  12. cout<<*s.upper_bound(3)<<endl;

  13. return 0;

  14. }

运行结果:

set中可以定义一个结构体进行排序

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e5+10;
#define ios                      \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
struct Info  
{  
    string name;  
    float score;
	bool operator < (const Info &a) const  
    {  
        //按score从大到小排列  
        return a.score<score;  
    }  
};
int main()
{
	set<Info>s;
	s.insert({"OZ",28.0});
	s.insert({"OA",277.0});
	s.insert({"NB",66.0});
	for(auto i:s)
	{
		cout<<i.name<<endl;
	}


}
struct road
{
	int pos;
	int val;
	bool operator<(const road &x) const 
	{
		return x.val>val;
	}
};
优先队列的运算符重载使容器从大到小排列

erase(iterator)  ,删除定位器iterator指向的值

erase(first,second),删除定位器first和second之间的值

erase(key_value),删除键值key_value的值

看看程序吧:

 
  1. #include <iostream>

  2. #include <set>

  3. using namespace std;

  4. int main(){

  5. set<int> s;

  6. set<int>::const_iterator iter;

  7. set<int>::iterator first;

  8. set<int>::iterator second;

  9. for(int i = 1 ; i <= 10 ; ++i)

  10. {

  11. s.insert(i);

  12. }

  13. //第一种删除

  14. s.erase(s.begin());

  15. //第二种删除

  16. first = s.begin();

  17. second = s.begin();

  18. second++;

  19. second++;

  20. s.erase(first,second);

  21. //第三种删除

  22. s.erase(8);

  23. cout<<"删除后 set 中元素是 :";

  24. for(iter = s.begin() ; iter != s.end() ; ++iter)

  25. {

  26. cout<<*iter<<" ";

  27. }

  28. cout<<endl;

  29. return 0;

  30. }

运行结果:

小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。

count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

示例代码:

 
  1. #include <iostream>

  2. #include <set>

  3. using namespace std;

  4. int main(){

  5. set<int> s;

  6. s.insert(1);

  7. s.insert(2);

  8. s.insert(3);

  9. s.insert(1);

  10. cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;

  11. cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;

  12. return 0;

  13. }

运行结果:

equal_range() ,返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。具体这个有什么用途我还没遇到过~~~

示例代码:

#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
     set<int> s;
     set<int>::iterator iter;
     for(int i = 1 ; i <= 5; ++i)
     {
         s.insert(i);
     }
     for(iter = s.begin() ; iter != s.end() ; ++iter)
     {
         cout<<*iter<<" ";
     }
     cout<<endl;
     cout<<"第一个大于等于 3 的数是 :"<<*s.equal_range(3).first<<endl;
     cout<<"第一个大于 3的数是 : "<<*s.equal_range(3).second<<endl;
     return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值