set是一棵红黑树,在一些操作上十分高效,还具有许多priority_queue没有的功能
下面是基本用法
//set
#include<set>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
set<int> s;
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
int t;
cin >> t;
s.insert(t);
}
//遍历:
set<int>::iterator it; //正向迭代器
for(it = s.begin(); it != s.end(); it++) //正向遍历(即由小到大输出)
cout << *it << " ";
cout << endl;
set<int>::reverse_iterator rit; //反向迭代器
for(rit = s.rbegin(); rit != s.rend(); rit++) //反向遍历(即由大到小输出)
cout << *rit << " ";
//元素的删除:可以删除迭代器上的元素,等于某键值的元素,区间上的元素和清空集合
it = s.begin();
for(int i = 1; i <= 2; i++)
s.erase(it++);
for(it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << endl;
s.clear();
for(it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << endl;
//元素的检索: 用s.find(),如果找到,则返回迭代器位置,否则返回s.end();
s.insert(5);
cout << *s.find(5) << endl;
if(s.find(20) == s.end()) cout << "NO";
return 0;
}
很多用到set时需要进行重载运算符,用法如下
//set
#include<set>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct mycmp //当set中的元素不是结构体时
{
bool operator () (const int &a, const int &b)
{
return a%10 < b%10;
}
};
set<int, mycmp> s1;
struct point
{
int x, y;
bool operator < (const point &a) const //当set中的元素是结构体时,直接写在结构体中
{
return x < a.x; //按照x从小到大排序
}
};
set<point> s2;
int main()
{
int n; cin >> n;
for(int i = 1; i <= n; i++)
{
int t; cin >> t; s1.insert(t);
}
set<int, mycmp>::iterator it1;
for(it1 = s1.begin(); it1 != s1.end(); it1++)
cout << *it1 << " ";
cout << endl;
for(int i = 1; i <= n; i++)
{
point t;
cin >> t.x >> t.y;
s2.insert(t);
}
set<point>::iterator it2;
for(it2 = s2.begin(); it2 != s2.end(); it2++)
cout << (*it2).x << " ";
return 0;
}