普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。我们来说一下C++的STL queue库中优先队列的使用方法。STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载<操作符。优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。

使用头文件queue。

优先队列的操作:

q.empty() 判断是否为空

q.size() 返回队列中元素的个数

q.pop() 删除队首元素,但不返回其值

q.top() 返回具有最高优先级的元素值,但不删除该元素

q.push() 在基于优先级的适当位置插入新元素

默认优先级为最大优先,除此之外共有3种自定义优先级方式。

 #include <iostream>
#include <functional>
#include <queue>
#include <vector> using namespace std; struct cmp1//定义比较结构
{
bool operator ()(int &a,int &b)
{
return a>b;//最小值优先
}
}; struct cmp2
{
bool operator ()(int &a,int &b)
{
return a<b;//最大值优先
}
}; struct number1//自定义数据结构
{
int x; bool operator < (const number1 &a) const
{
return x>a.x;//最小值优先
}
}; struct number2
{
int x; bool operator < (const number2 &a) const
{
return x<a.x;//最大值优先
}
}; int main()
{
int n;
cin>>n;
int a[];
number1 num1[];
number2 num2[];
for(int i=;i<n;i++)
{
cin>>a[i];
num1[i].x=a[i];
num2[i].x=a[i];
}
cout<<endl;
priority_queue<int>Q0;//采用默认优先级构造队列
priority_queue<int,vector<int>,cmp1>Q1;//最小值优先
priority_queue<int,vector<int>,cmp2>Q2;//最大值优先
priority_queue<int,vector<int>,greater<int> >Q3;//一定要有空格“> >”,“>>”会被认为错误
priority_queue<int,vector<int>,less<int> >Q4;////最大值优先
priority_queue<number1>Q5; //最小优先级队列
priority_queue<number2>Q6; //最大优先级队列
int i;
for(i=; i<n; i++)
{
Q0.push(a[i]);
Q1.push(a[i]);
Q2.push(a[i]);
Q3.push(a[i]);
Q4.push(a[i]);
}
for(i=; i<n; i++)
Q5.push(num1[i]);
for(i=; i<n; i++)
Q6.push(num2[i]);
//采用默认优先关系 (priority_queue<int>que)
cout<<"Queue0:"<<endl;
while(!Q0.empty())
{
cout<<Q0.top()<<" ";
Q0.pop();
}
cout<<endl<<endl;
//采用结构体自定义优先级方式一 (priority_queue<int,vector<int>,cmp>que)
cout<<"Queue1:"<<endl;
while(!Q1.empty())
{
cout<<Q1.top()<<" ";
Q1.pop();
}
cout<<endl;
cout<<"Queue2:"<<endl;
while(!Q2.empty())
{
cout<<Q2.top()<<" ";
Q2.pop();
}
cout<<endl<<endl;
//采用头文件functional内定义优先级 (priority_queue<int,vector<int>,greater<int>/less<int> >que)
cout<<"Queue3:"<<endl;
while(!Q3.empty())
{
cout<<Q3.top()<<" ";
Q3.pop();
}
cout<<endl;
cout<<"Queue4:"<<endl;
while(!Q4.empty())
{
cout<<Q4.top()<<" ";
Q4.pop();
}
cout<<endl<<endl;
//采用结构体自定义优先级方式二 (priority_queue<number>que)
cout<<"Queue5:"<<endl;
while(!Q5.empty())
{
cout<<Q5.top().x<<" ";
Q5.pop();
}
cout<<endl;
cout<<"Queue6:"<<endl;
while(!Q6.empty())
{
cout<<Q6.top().x<<" ";
Q6.pop();
}
cout<<endl;
return ;
}

运行结果:

STL中优先队列的使用的更多相关文章

  1. STL之优先队列

    STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...

  2. STL中队列(queue)的使用方法

    STL 中队列的使用(queue) 基本操作: push(x) 将x压入队列的末端 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() 返回第一个元素(队顶元素) ...

  3. 手写队列以及stl中队列的使用

    一,手写队列. struct queue { ; ,rear=,a[maxn]; void push(int x) { a[++rear]=x; } void pop() { first++; } i ...

  4. 浅谈C++ STL中的优先队列(priority_queue)

    从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...

  5. STL中heap相关函数

    heap并不是属于STL中的containers,而是在<algorithm>下提供了相关的函数 make_heap,sort_heap,pop_heap,push_heap 函数的说明: ...

  6. STL中sort、priority_queue、map、set的自定义比较函数

    STL中,sort的默认排序为less,也就是说从小到大排序:priority_queue默认是less,也就说大顶堆:map默认是less,也就说用迭代器迭代的时候默认是小的排在前面:set默认是l ...

  7. STL中六大组件

    1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供.为了访问容器中的数据,可以使用由容器类输出的迭代器: 容器(container)用于存放 ...

  8. C++ 队列!还是要从 STL 中的说起……

    1. 前言 队列和栈一样,都是受限的数据结构. 队列遵循先进先出的存储原则,类似于一根水管,水从一端进入,再从另一端出去.进入的一端称为队尾,出去的一端称为队头. 队列有 2 个常规操作: 入队:进入 ...

  9. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

随机推荐

  1. node.js+express,实现RESTful API

    node代码如下(exptest.js): var express = require('express'); var bodyParser = require('body-parser'); var ...

  2. Java 存储和读取 oracle CLOB 类型字段的实用方法

    import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.io.Str ...

  3. VMware vSphere克隆虚拟机

    参考资料:http://blog.csdn.net/shen_jz2012/article/details/48416771 1. 首先将你所要克隆的虚拟机关掉 2. 选择你的ESXI服务器     ...

  4. 2018年11月25日ICPC焦作站参赛总结

    可能就这么退役了吧. 对这次ICPC还是比较有信心的,毕竟心态都放平和了. 路途很波折,热身赛还是赶上了. 等到了正赛的时候,开场看出了A题的签到,签到肯定是我来签的,11分钟签完了这道题之后,开始看 ...

  5. [转载]使用 NuGet 管理项目库

    原文:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Mi ...

  6. JavaScript的单线程性质以及定时器的工作原理

    前些日子还在网上争论过js动画用setTimeout还是setInterval,个人偏向于setTimeout,当动画中牵扯到ajax时用setInterval会有时间偏差,出现一些问题即使用clea ...

  7. 新.Net架构必备工具列表

    N多年前微软官网曾发了.Net下必备的十种工具,N多年过去了,世异时移,很多东西都已经变化了,那个列表也似乎陈旧了.而且,该文也只是对十种工具独立的介绍,显得有些罗列的感觉,是不是每个工具都是同等重要 ...

  8. javascritpt创建对象

    javascript添加对象示例: <script> person=new Object(); person.firstname="Bill"; person.last ...

  9. 关联查询resultMap使用规则总结——(十一)

    resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用re ...

  10. oracle日期、转换函数

    转换函数 日期类型转换成字符类型 select to_char(sysdate) s1, --14-3月 -16        to_char(sysdate, 'yyyy-mm-dd') s2, - ...