set
头文件
#include<set>
using namespace std;
定义
set <int,greater<int> > s //从s.begin()到s.end()的遍历结果为从大到小
set <int,less<int> > s //从s.begin()到s.end()的遍历结果为从小到大
set <st1> s //用结构体st1定义set,需要重载小于号
set <st1,cmp> s //用自定义的比较结构体cmp定义set
常用函数
s.insert(x) //插入一个数x,若s是set则不会发生任何事,若s是multiset则计数+1
erase(iterator) //删除定位器iterator指向的元素(只删除指向的那一个)
erase(key_value) //删除所有值为key_value的元素
s.begin() //返回第一个元素的迭代器
s.rbegin() //返回最后一个元素的反向迭代器
s.end() //返回最后一个元素之后的空迭代器
s.find(x) //返回一个指向x的迭代器,如果找不到则返回s.end()
s.lower_bound(x) //返回按照排序规则在x之后的第一个元素的迭代器(可以等于x)
s.upper_bound(x) //返回按照排序规则在x之后的第一个元素的迭代器(不能等于x)
s.size() //返回set中元素的个数
s.clear() //清空set 复杂度O(N)
s.empty() //判断set是否为空
s.count(x) //返回set中x出现的个数
遍历方法
- 一般元素
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
printf("%d\n",*it);
}
- 结构体元素
set<st1>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
printf("%d %d\n",it->x,it->y);
}
自定义排序方法
以下为以x为第一关键字,y为第二关键字排序举例。
- 重载运算符:需要重载小于号
struct st1{
int x;
int y;
};
bool operator < (st1 a, st1 b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
multiset <st1> s;
- 自定义比较结构体:需要重载双括号()
struct st1{
int x;
int y;
};
struct cmp{
bool operator () (st1 a,st1 b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
};
multiset <st1,cmp> s;
需要注意的是,与sort的比较函数相同,当两元素相同时必须返回false。
multiset的用法与set基本一致,引用头文件相同。

浙公网安备 33010602011771号