set

今天看到了一道题,最开始想用优先队列,发现不能同时控制队列的头和尾,双向队列又不知道怎么排序,所以学到了一个新技能,就是利用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值