set是一个集合内部使用红黑树的原理默认从小到大进行排序
map和set封装了二叉树等
在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。
注意:
1、set中的元素都是排好序的
2、set集合中没有重复的元素
lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器
示例代码:
-
#include <iostream>
-
#include <set>
-
using namespace std;
-
int main()
-
{
-
set<int> s;
-
s.insert(1);
-
s.insert(3);
-
s.insert(4);
-
cout<<*s.lower_bound(2)<<endl;
-
cout<<*s.lower_bound(3)<<endl;
-
cout<<*s.upper_bound(3)<<endl;
-
return 0;
-
}
运行结果:
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的值
看看程序吧:
-
#include <iostream>
-
#include <set>
-
using namespace std;
-
int main(){
-
set<int> s;
-
set<int>::const_iterator iter;
-
set<int>::iterator first;
-
set<int>::iterator second;
-
for(int i = 1 ; i <= 10 ; ++i)
-
{
-
s.insert(i);
-
}
-
//第一种删除
-
s.erase(s.begin());
-
//第二种删除
-
first = s.begin();
-
second = s.begin();
-
second++;
-
second++;
-
s.erase(first,second);
-
//第三种删除
-
s.erase(8);
-
cout<<"删除后 set 中元素是 :";
-
for(iter = s.begin() ; iter != s.end() ; ++iter)
-
{
-
cout<<*iter<<" ";
-
}
-
cout<<endl;
-
return 0;
-
}
运行结果:
小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。
count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
示例代码:
-
#include <iostream>
-
#include <set>
-
using namespace std;
-
int main(){
-
set<int> s;
-
s.insert(1);
-
s.insert(2);
-
s.insert(3);
-
s.insert(1);
-
cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
-
cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
-
return 0;
-
}
运行结果:
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;
}