priority_queue(优先队列)的用法(包括pbds)
置顶!!!
有时候在定义的时候,不要把两个<<或者>>连在一起写,以免被编译器错误理解!!!!
头文件
#include <queue>
queue的一般用法不再叙述
类型名 priority_queue
常用函数
(设变量名为q)
q.pop();
q.push(x);
q.size();
q.empty();
q.top(); //注意与一般的queue中的q.front()不同
一般默认大根堆
使用小根堆的方法
priority_queue<int,vector<int>,greater<int>> q; //当然大根堆就是less
自定义优先级:
方法一:
struct rec{
int a,b
};
struct cmp {
bool operator ()(rec x, rec y)
{
return x.a > y.a; //结构体中,x小的优先级高 (意即大于号出来的是小根堆)
}
};
priority_queue<int, vector<int>, cmp> q; //定义方法
方法二:
struct node {
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高 (意即大于号出来的是小根堆)
}
};
priority_queue<node>q; //定义方法
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
下面是平板电视的部分
pb_ds头文件
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
//这个是pb_ds要求的头文件,注意平板电视里面涉及的头文件都不在bits/std标准库中
优先队列(堆)要求的头文件
#include <ext/pb_ds/priority_queue.hpp>
命名空间
using namespace __gnu_pbds;
(当心前面是两个下划线啊,当心啊!!!)
//当然pb_ds还有其他非常好用的数据结构,只不过我现在还不会
//留个坑待填(虽然可能不会填)
常用函数
与priority_queue基本相同
有一些拓展的函数
q.join(q1); //把q1全部合并到q中去,并且把q1清空
q.point_iterator; //对应某元素的迭代器
q.erase(point_iterator it); //删除对应点
q.modify(point_iterator it,const_reference r_new_val); //修改对应点的值(这是优化dijkstra神方法,均摊复杂度O(1))
//迭代器这一部分我不会啊 又留了一个坑
//如果学会就好了,这个确实很实用
定义方法
__gnu_pbds::priority_queue<int,greater<int>,TAG> Q;//小根堆,大根堆写less<int>
//注意这个里面的前面的__gnu_pbds::不要省略,因为虽然定义了命名空间,但是因为标准库里面也有priority_queue,这个就很ambigious
其中的TAG为类型,有以下几种:
pairing_heap_tag
thin_heap_tag
binomial_heap_tag
rc_binomial_heap_tag
binary_heap_tag
其中pairing_help_tag最快
关于自定义的比较
对于上方的两种方式,经过我的多次实验,发现只有第一个可用,第二种无论我怎么调都是CE,这个与优先队列的定义方法有关
就采用第一种罢!
对于第一种,结构体定义都是一样的
定义方法改成这样
__gnu_pbds::priority_queue<rec,cmp,pairing_heap_tag> Q;
大概就是以上部分
priority_queue的常见用法 priority_queue是什么? 优先队列 底层实现用堆来实现 每次队首的优先级最大 priority_queue的定义 引入头文件 # include & ... /* 第20章 priority_queue优先队列容器 20.1 priority_queue技术原理 20.2 priority_queue应用基础 20.3 本章小结 */ // 第20章 pr ... stack堆栈是一个后进先出的线性表,插入和删除元素都在表的一端进行. stack堆栈的使用方法: 采用push()方法将元素入栈: 采用pop()方法将元素出栈: 采用top()方法访问栈顶元素: ... priority_queue优先队列/C++ 概述 priority_queue是一个拥有权值观念的queue,只允许在底端加入元素,并从顶端取出元素. priority_queue带有权值观念,权值 ... //采用默认优先关系: //(priority_queue<int>que;) //Queue 0: // 91 83 72 56 47 36 22 14 10 7 3 // //采用结构 ... 优先队列是单向队列的一种,可以按照默认或自定义的一种方式来对队列中的数据进行动态排序 template<class _Ty, class _Container = vector<_Ty&g ... 转自:http://www.cppblog.com/shyli/archive/2007/04/06/21366.html http://www.cppblog.com/shyli/archive/2 ... 懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ... 堆(heap)不是stl中的东西...它分为 max heap 和min heap. 但我不想用这些,而是采用了priority_queue,优先队列,定义在queue中.顾名思义,它的作用就是无论怎 ... 关于 spinder 在这个框架里面 和不用数据库 相同 # -*- coding: utf-8 -*- import scrapy from yang_guan.items import ... 源代码 ajax1.html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ... <?php $arr=array(2,54,167,'a','A','12'); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr); / ... 情景再现 修改ModelForm 效果 环境变量和文件查找 介绍环境变量的作用与用法 及几种搜索文件的方法 学会这些技巧可以高效地使用 Linux 知识点:环境变量的设置 环境变量的修改 环境变量 要解释环境变量,得先明白变量是什么,准确的 ... 1.超继承 重写测试用例类的init方法,如下所示. import requests import unittest class XiaoheiCases(unittest.TestCase): de ... 1 Java面向对象:设计window画板的类框架.假设现在只有 直线.矩形.椭圆,怎么设计 2 Linux shell命令 定时怎么做 3 平时有问题经常访问那些网站 4 假设你现在是web网站 ... 这个柿子挺别致的......还有信仰膜数998244353 直接讲正解吧...... 首先发现这个柿子从上往下算好像不怎么行,我们从下往上看,(下面令\(Ans_r = sum_{k,1,r}\)). ... LuoguP4381 [IOI2008]Island Description 一句话题意:给一个基环树森林,求每棵基环树的直径长度的和(基环树的直径定义与树类似,即基环树上一条最长的简单路径),节点总 ... 解决办法: 添加到受影响的 module build.gradle 中(比如app的gradle文件根代码下) configurations.all { resolutionStrategy.each ...priority_queue(优先队列)的用法(包括pbds)的更多相关文章
随机推荐