今天看到了一道题,最开始想用优先队列,发现不能同时控制队列的头和尾,双向队列又不知道怎么排序,所以学到了一个新技能,就是利用c++模板库中的set
set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。
先附上几个set的常用方法,注意其中很多都是返回一个迭代器,而不是像队列里面返回一个值
set<int>::iterator it; //定义迭代器的方法
#include<set> //最开始要添加声明
1. begin()--返回指向第一个元素的迭代器
2. clear()--清除所有元素
3. count()--返回某个值元素的个数
4. empty()--如果集合为空,返回true
5. end()--返回指向最后一个元素的迭代器
7. erase()--删除集合中的元素
8. find()--返回一个指向被查找到元素的迭代器
10. insert()--在集合中插入元素
11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
12. key_comp()--返回一个用于元素间值比较的函数
13. max_size()--返回集合能容纳的元素的最大限值
16. size()--集合中元素的数目
17. swap()--交换两个集合变量
18. upper_bound()--返回大于某个值元素的迭代器
附上该题 双队列
-
描述
-
系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求
0
系统停止运行
1 K P
优先度为P的客户K进入系统
2
找到优先度最高的客户,然后此客户离开系统
3
找到优先度最低的客户,然后此客户离开系统
输入
- 每行包括一个请求,最后一行包括一个停止请求(代码0)。对于添加客户请求(代码1),优先度都是唯一的。客户的表示K小于10 6,优先度P小于10 7,一个客户可能会被添加多次,每次的优先度可能不同。 输出
- 对于每个请求2和3,程序必须输出一行。这行包括此请求中找到客户的id。如果系统中没有客户,输出0 样例输入
-
21 20 141 30 321 10 993220
样例输出
-
02030100
#include<stdio.h>
#include<set>
#include<iostream>
using namespace std;
struct C{
int num;
int pri;
//构造函数
C(int n, int p) :num(n), pri(p) {}
//重新定义排序的符号
bool operator <(const C&a) const {
return pri < a.pri;
}
};
set<C> client;
set<C>::iterator it;
int main() {
int n;
while (scanf("%d", &n)&&n!=0) {
int x, y;
if (n == 1) {
cin >> x >> y;
client.insert(C(x,y));
}
if (client.empty() == true) {
cout << 0 << endl;
}
else if (n == 2) {
it = client.end();
it--;
cout << (*it).num << endl;
client.erase(*it);
}
else if (n == 3) {
it = client.begin();
cout << (*it).num << endl;
client.erase(*it);
}
}
return 0;
}