priority_queue与multiset
感觉c++最有用的stl是bitset、堆(优先队列)和平衡树,其他的都可以手打
这里主要讲一下堆和平衡树的基本用法和区别所在
priority_queue
堆/优先队列
定义:
priority_queue<类型>
priority_queue<int> 大根堆
priority_queue<int,vector<int>,less<int> > 大根堆
priority_queue<int,vector<int>,greater<int> > 小根堆
priority_queue<结构体>
基本函数:
push(x):加入一个元素,可以是数or结构体
pop():弹出堆顶
top():堆顶的元素
size():堆的大小
empty():是否为空(空即为1)
关于结构体的比较:
struct type{
int x,y;
bool friend operator < (type a,type b) {return a.x<b.x;}
//反正这样写就对了
};
结构体的赋值可以为{a,b,...}或 名称{a,b,...}
multiset
与set的不同在于multiset可以有重复元素,所以一般都用multiset
定义:
multiset<类型>
multiset<int> 从小到大
multiset<int,less<int> > 从小到大
multiset<int,greater<int> > 从大到小
multiset<结构体>
迭代器:
multiset<定义和对应的set一致> ::iterator
作用是遍历set/特别指向某一个元素
基本函数:
insert(x):加入一个元素,可以是数/结构体
erase(x):
有两种情况
①x是数/结构体
那么会把所有的x删掉
②x是某一个迭代器
那么只会删掉迭代器对应的元素
begin():返回关键值最小的元素指针
(指针x对应的值为*x,如果是结构体则为(*x).a)
end():返回关键值最大的元素指针的后一位(最大的是--end())
size()、empty():同优先队列
lower_bound(x):第一个大于等于x的元素指针
upper_bound(x):第一个大于x的元素指针
小于等于=大于 的前一位,小于=大于等于 的前一位
e.insert(1);e.insert(2);e.insert(3);e.insert(4);e.insert(5);
cout<<*e.lower_bound(3)<<" "<<*e.upper_bound(3)<<endl; //>= >
cout<<*--e.lower_bound(3)<<" "<<*--e.upper_bound(3)<<endl; //< <=
//3 4
//2 3
遍历:
可以通过迭代器的移动来遍历
(头为begin(),尾为--end(),最大能走到end())
e.insert(1);e.insert(2);e.insert(3);
I=e.begin();
while (I!=e.end())
cout<<*I<<" ",*++I;
cout<<endl;
//1 2 3
区别
multiset可以遍历/找前驱后继/删除
*重点:priority_queue的比较机制和set/sort相反
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <set>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
struct type{
int x,y;
bool friend operator < (type a,type b) {return a.x<b.x;}
};
multiset<type> a;
priority_queue<type> b;
type c[3];
int main()
{
a.insert({3,3});a.insert({2,2});a.insert({1,1});
b.push({1,1});b.push({2,2});b.push({3,3});
c[0]={3,3};c[1]={2,2};c[2]={1,1};
sort(c,c+3);
cout<<(*a.begin()).x<<" "<<b.top().x<<" "<<c[0].x<<endl;
//1 3 1
}
可以发现,优先队列得到的结果和multiset/sort刚好相反
实际上,multiset/sort最终的状态满足a1<a2<a3...<an(<可以是定义的运算)
而priority_queue应该是当一个元素x满足fa[x]<x时交换,实质上维护的是大根堆
一种记忆方法:"优先"队列=先大后小
priority_queue与multiset的更多相关文章
- POJ 2431 Expedition (priority_queue或者multiset可解)
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18655 Accepted: 5405 Descr ...
- [CareerCup] 11.8 The Rank of Number 数的排行
11.8 Imagine you are reading in a stream of integers. Periodically, you wish to be able to look up t ...
- CSP-S 2019提高组训练 服务器需求
时间限制:C/C++ 3秒 空间限制:C/C++ 262144K 题目描述 小多计划在接下来的n天里租用一些服务器,所有的服务器都是相同的.接下来n天中,第i天需要\(a_i\)台服务器工作,每台服务 ...
- STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)
一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...
- HDU 4006 The kth great number(multiset(或者)优先队列)
题目 询问第K大的数 //这是我最初的想法,用multiset,AC了——好吧,也许是数据弱也有可能 //multiset运用——不去重,边插入边排序 //iterator的运用,插入的时候,如果是相 ...
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)
向量(vector) <vector> 连续存储的元素<vector> Vector<int>c; c.back() 传回最后一个数据,不检查这个数据是否存在 ...
- nyoj 55 懒省事的小明 优先队列 multiset 还有暴力
懒省事的小明 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的 ...
- multimap 和priority_queue详解
上一期是关于STL和并查集结合的例题,也附了STL中部分容器的使用摘要,由于是从网上东拼西凑的,感觉有的关键点还是没解释清楚,现在从其中摘出两个容器,用例题对它们的用法进行进一步解释. 以下是例题的介 ...
- HDU 4268 multiset
http://acm.hust.edu.cn/vjudge/contest/123100#problem/B #include <iostream> #include <string ...
随机推荐
- 一文搞懂HTTP和HTTPS协议
1.什么是协议? 网络协议是计算机之间为了实现网络通信而达成的一种"约定"或者"规则",有了这种"约定",不同厂商的生产设备,以及不同操作系 ...
- 【神经网络与深度学习】caffe静态链接库“Unknown layer type: Convolution (known types: )”和“ 磁盘空间不足”问题的解决办法
这一段时间把caffe在windows环境下编译了一下,tool里面的cpp全部编译成了exe.再用的时候有两个问题让我头疼了好长时间! 第一个问题 "db_lmdb.hpp:14] Che ...
- [Python3] 032 常用模块 random
目录 random 1. random.random() 2. random.choice() 3. random.shuffle() 4. random.randint() 5. random.ra ...
- SSCursor 处理大量数据
使用游标的好处是不会将查询结果全部都放入内存中,避免了占用大量的内存,会从存储块中读取记录,并且一条一条的返回来 class DbConnection(object): def __init__(se ...
- c语言中宏定义#和 ##的作用:
转载:http://www.cnblogs.com/cyttina/archive/2013/05/11/3072969.html 看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了 ...
- python-event事件-模仿红绿灯
import time import threading event =threading.Event() def lighter(): count=0 event.set()#先设置成绿灯 whil ...
- RabbitMQ入门教程(十二):消息确认Ack
原文:RabbitMQ入门教程(十二):消息确认Ack 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csd ...
- scala 从头越
一个综合小例子, 要严格区分 函数与方法 , 与 java 不一样 /** * Scala 的值类型有 7 种 * Byte * Char * Short * Int * Long * Float * ...
- Verilog中的Timescale作用
很多时候,我们拿到已有的东西理所当然的用了,其实,你真的对你所使用的东西了解吗? 再次犯下这样的错误,是因为在把代码从Altera 的CycloneV移植到Xilinx的Spartan6上,我遇到了非 ...
- C++ ->error LNK1123
终极解决方案:VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入 ...