在第一场CCCC选拔赛上,有一关于系统调度的水题。利用优先队列很容易AC。

  // 由于比赛时花费了不少时间研究如何定义priority_queue的比较函数,决心把STL熟练掌握...

  

Queue

  首先来看http://www.cplusplus.com/reference/queue/queue/对STL Queue容器的介绍。

  在C++中只要#include<queue>可使用队列类,常用的成员函数有

1. push

2. pop

3. size

4. empty

5. front

6. back     // 目前还没使用过,留意一下

  队列在BFS时经常使用,已经比较熟悉其用法。

Priority_queue

  在CPP网站上同样也有优先队列的详细介绍。在《数据结构与算法分析》一书上,堆(heap)等同于优先队列,或者准确地说,优先队列是通过堆实现的。

  相比队列,priority_queue的成员函数名基本一致,除了将front改为top,都是获取队首元素。

1. push

2. pop

3. size

4. empty

5. top


一般情况下使用方式与vector,queue一样,需要自定义数据类型时稍有点不同了。
priority_queue<int, vector<int>, greater<int> > q;  // 小顶堆
priority_queue<int, vector<int>, less<int> > q; // 大顶堆,默认 // 自定义数据结构
// 方式一
struct Node{
int x, y;
Node(int a = , int b= ):x(a), y(b) {}
}; struct cmp{
bool operator() (const Node& a, const Node& b ){
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
}
}; priority_queue<Node, vector<Node>, cmp> q; // 方式二
struct Node{
int x, y;
Node(int a = , int b= ):x(a), y(b) {}
}; bool operator < (const Node& a, const Node& b ){
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
}

  上次比赛时,我忘了如何加上vector<int>部分,摸索半天通过方式二(编写的友元函数实现)才成功调试好代码,浪费了大量的时间。希望以后能记牢,平常多加练习达到熟练运用的水平^_^

STL 堆操作

  // 参考COPY自https://blog.csdn.net/my_lovely_lemon_tree/article/details/78007316

  头文件是#include <algorithm>
  一般用到这四个:make_heap()、pop_heap()、push_heap()、sort_heap();
  (1)make_heap()构造堆
  void make_heap(first_pointer,end_pointer,compare_function);
  默认比较函数是(<),即最大堆。
  函数的作用是将[begin,end)内的元素处理成堆的结构

  (2)push_heap()添加元素到堆
  void push_heap(first_pointer,end_pointer,compare_function);
  新添加一个元素在末尾,然后重新调整堆序。该算法必须是在一个已经满足堆序的条件下。
  先在vector的末尾添加元素,再调用push_heap

  (3)pop_heap()从堆中移出元素
  void pop_heap(first_pointer,end_pointer,compare_function);
  把堆顶元素取出来,放到了数组或者是vector的末尾。
  要取走,则可以使用底部容器(vector)提供的pop_back()函数。
  先调用pop_heap再从vector中pop_back元素

  (4)sort_heap()对整个堆排序
  排序之后的元素就不再是一个合法的堆了。

STL 最大堆与最小堆的更多相关文章

  1. C++ multiset通过greater、less指定排序方式,实现最大堆、最小堆功能

    STL中的set和multiset基于红黑树实现,默认排序为从小到大. 定义三个multiset实例,进行测试: multiset<int, greater<int>> gre ...

  2. c++/java/python priority_que实现最大堆和最小堆

    #include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...

  3. Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

    Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...

  4. PAT-1147(Heaps)最大堆和最小堆的判断+构建树

    Heaps PAT-1147 #include<iostream> #include<cstring> #include<string> #include<a ...

  5. -Xmx 和 –Xms 设置最大堆和最小堆

    C:\Java\jre1.6.0\bin\javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子: -vmargs     -Xms128M     -Xmx512M ...

  6. HDUOJ----4006The kth great number(最小堆...)

    The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Oth ...

  7. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  8. java最大最小堆

    堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...

  9. 最大堆 最小堆 解决TOPK问题

    堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...

随机推荐

  1. Victor and String HDU - 5421 双向回文树

    题意: 有n种操作,开始给你一个空串,给你4中操作 1 c  在字符串的首部添加字符c 2 c  在字符串的尾部添加字符c 3  询问字符中的本质不同的回文串的个数 4 询问字符串中回文串的个数 思路 ...

  2. EFCore学习记录笔记

    1:连接slqlocaldb数据库 (1)在CMD下可以输入sqllocaldb info 查看本机安装的所有的localdb实例 (2)数据库连接字符串为:“Server=(localdb)\\MS ...

  3. Soci介绍

    soci是一个用C++封装的数据库访问库,目前通过 “前端(应用程序)/核心/后端(数据库适配)”模式支持firebird,mysql,sqlite3,oracle,postgresql,odbc多种 ...

  4. Pod 私有仓库构建

    Pod 私有仓库构建 创建`私有仓库索引库`(iOS) 添加`私有仓库索引库`到本地repo管理 创建自己的`组建库工程 上传`组建库工程`到`私有仓库索引库` App工程调用`组建库工程` 目的 私 ...

  5. swing 托盘

    直接上方法, 不过有些问题要注意,最后会说明! private void systemTray() { if (SystemTray.isSupported()) { // 判断系统是否支持托盘功能. ...

  6. ASP.NET网站要手机自适应页面

    本文转载的地址:http://mobile.51cto.com/ahot-409516.htm 一. 允许网页宽度自动调整: "自适应网页设计"到底是怎么做到的? 其实并不难. 首 ...

  7. 关于Qt5(1)-- 两个窗口互相切换的例子

    <QT Creator快速入门>这本书有一章介绍model和modeless的概念时,用到了两个窗口互相切换的例子.但是原文对该例子的说明非常模糊不清,现整理如下. 1,要求:登陆界面.主 ...

  8. day27 模块:正则re, configparser, subprocess

    Python之路,Day15 = Python基础15 re 模块补充 ret = re.findall("c.d", "abc\nd", re.S) # 后面 ...

  9. poj 1742 Coins(二进制优化多重背包)

    传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...

  10. day20_函数的闭包 与 装饰器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...