C++ 优先队列

#include <queue>

priority_queue<Type, Container, Functional>:Type为数据的类型,Container为数据存储的容器类型,Functional为比较函数

默认是vector,最大堆

下面,描述如何定制优先队列

我们在这里关注比较函数的实现,对于比较函数有两种方式,一种是定义单独的比较函数,另一种是在定义的数据类型内部定义比较策略

一、仿函数体现出比一般的函数更大的灵活性,我们使用仿函数来实现

struct cmpmin{
bool operator ()(int& a,int &b){
return a>b;
}
}; struct cmpmax{
bool operator() (int& a,int& b){
return a<b;
}
};

当定义大于号的时候是小数优先,当定义小于号的时候是大数优先

实际上仿函数可以看做是对小于号的重载。

二、在数据类型内部加以定义

struct minnode{
int data;
bool operator < (const minnode& node) const{
return this->data>node.data;
}
}; struct maxnode{
int data;
bool operator < (const maxnode& node)const{
return this->data<node.data;
}
};

这里实现小于号(实际上只能实现小于号,实现大于号会报错),它的意义和上面是一样的,

当定义大于号的时候是小数优先,当定义小于号的时候是大数优先。

总是外部定义和内部实现一致的时候是递增,如果不一致时递减

下面举个栗子

int nums[]={,,,,,,,,,};
minnode minnodes[]={,,,,,,,,,};
maxnode maxnodes[]={,,,,,,,,,};
int main()
{
queue<int> q;//normal queue
priority_queue<int,vector<int>,cmpmin> minq;//minimum queue
priority_queue<int,vector<int>,cmpmax> maxq;//maximum queue
priority_queue<minnode,vector<minnode> >minnodeq;
priority_queue<maxnode,vector<maxnode> >maxnodeq;
for(int i=;i<;i++){
q.push(nums[i]);
minq.push(nums[i]);
maxq.push(nums[i]);
minnodeq.push(minnodes[i]);
maxnodeq.push(maxnodes[i]);
}
cout<<""<<q.front()<<" "<<q.back()<<endl;// 3 15

   cout << "top of minq " << minq.top() << endl;//1
     cout << "top of maxq " << maxq.top() << endl;//43
    cout << "top of minnodeq " << minnodeq.top().data << endl;//1
   cout << "top of maxnodeq " <<maxnodeq.top().data << endl;//43

    return ;
}

在一些操作上,queue和priority_queue是不一样的,前者是一个线性的结构,因此可以使用队前,队尾函数,也就是front(),back(),但是优先队列的意义已经和传统的队列的意义不太一样了,实际上是一个堆,队前、队尾函数不可用,可以使用的函数是top()。两者都可以使用pop()函数来去掉队首或者堆顶的数据。

C++ 优先队列的更多相关文章

  1. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  2. 数据结构:优先队列 基于list实现(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...

  3. python优先队列,队列和栈

    打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...

  4. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

  5. Java优先队列

    按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...

  6. 优先队列实现Huffman编码

    首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...

  7. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

  8. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  9. 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)

    ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...

  10. javascript数据结构-优先队列

    这里之所以扩充一个 有限队列 是因为,生活使用中队列通常会附加优先级,比如排队买票,一般老人和军人等会有优先权限. 实现:继承上篇的 普通队列实现.这里用一种方法,入队的时候,进行排序插入到指定位置, ...

随机推荐

  1. 43. Merge Sorted Array && LRU Cache

    Merge Sorted Array OJ: https://oj.leetcode.com/problems/merge-sorted-array/ Given two sorted integer ...

  2. 类似新浪 腾讯微博字数统计 控制js(区分中英文 符号)

    <script> ; function Q(s) { return document.getElementById(s); } function checkWord(c) { len = ...

  3. Android ImageView显示本地图片

    Android ImageView 显示本地图片 布局文件 <?xml version="1.0" encoding="utf-8"?> <R ...

  4. Servlet Cookie处理

    Servlet Cookie 处理 Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息.Java Servlet 显然支持 HTTP Cookie. 识别返回用户包括三个步骤: 服务 ...

  5. nginx的gzip选项和expire过期时间记录

    最近,参加了公司的组织的一个公开课,收获还是挺多的,下面来总结接一下: 一. 使用nginx来进行网页内容的压缩编码与传输速度的优化: 先来观察一下news.sina.com.cn在请求和传输的时候发 ...

  6. Mysql 存储过程基本语法

    delimiter //一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行. 一.创建存储过程 1.基本语法: crea ...

  7. tomcat7.0 处理问题

    修改tomcat的用户密码 打开tomcat的conf/tomcat-users.xml 将<user username="admin" password="123 ...

  8. centos6.x下手工安装二进制Docker v1.1x

    Docker在 centos 6.x 下面默认最新的版本是1.7, 然而这个并不符合我的实际需求, 尤其我需要 docker-compose 来作为编配工具部署swarm, 所以只有使用二进制的安装包 ...

  9. Ruby-打包程序

    1.下载 ocra-1.3.1.gem 文件 2.打开“start Command prompt with ruby”  命令窗口 3.输入 “gem install e:\ocra-1.3.1.ge ...

  10. Ubuntu14.04环境下Samba报错排错过程

    排错的方法和思路非常重要,日志非常非常非常非常重要!!! 搭建好Samba之后,windos访问一直下面这个错误,然后傻逼一样一直百度百度,一弄又是几天,但是经过自己一步一步的排错,弄成功之后,那心情 ...