priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。下面给出priority_queue的函数列表和VS2008中priority_queue的源代码,本文中与heap有关的函数参见《STL系列之四
heap 堆》。
priority_queue函数列表
函数 |
描述byMoreWindows(http://blog.csdn.net/MoreWindows)
|
构造析构
|
|
priority_queue <Elem> c
|
创建一个空的queue 。
注:priority_queue构造函数有7个版本,请查阅MSDN
|
数据访问与增减
|
|
c.top() |
返回队列头部数据
|
c.push(elem) |
在队列尾部增加elem数据
|
c.pop() |
队列头部数据出队
|
其它操作
|
|
c.empty() |
判断队列是否为空 |
c.size() |
返回队列中数据的个数
|
|
|
可以看出priority_queue的函数列表与栈stack的函数列表是相同的。
VS2008中priority_queue 优先级队列的源代码
友情提示:初次阅读时请注意其实现思想,不要在细节上浪费过多的时间
-
-
template<class_Ty,class_Container=vector<_Ty>,class_Pr=less<typename_Container::value_type>>
-
classpriority_queue
-
{
-
public:
-
typedef_Containercontainer_type;
-
typedeftypename_Container::value_typevalue_type;
-
typedeftypename_Container::size_typesize_type;
-
typedeftypename_Container::referencereference;
-
typedeftypename_Container::const_referenceconst_reference;
-
-
priority_queue():c(),comp()
-
{
-
}
-
-
explicitpriority_queue(const_Pr&_Pred):c(),comp(_Pred)
-
{
-
}
-
-
priority_queue(const_Pr&_Pred,const_Container&_Cont):c(_Cont),comp(_Pred)
-
{
-
make_heap(c.begin(),c.end(),comp);
-
}
-
-
template<class_Iter>
-
priority_queue(_Iter_First,_Iter_Last):c(_First,_Last),comp()
-
{
-
make_heap(c.begin(),c.end(),comp);
-
}
-
-
template<class_Iter>
-
priority_queue(_Iter_First,_Iter_Last,const_Pr&_Pred):c(_First,_Last),comp(_Pred)
-
{
-
make_heap(c.begin(),c.end(),comp);
-
}
-
-
template<class_Iter>
-
priority_queue(_Iter_First,_Iter_Last,const_Pr&_Pred,const_Container&_Cont):c(_Cont),comp(_Pred)
-
{
-
c.insert(c.end(),_First,_Last);
-
make_heap(c.begin(),c.end(),comp);
-
}
-
-
boolempty()const
-
{
-
return(c.empty());
-
}
-
-
size_typesize()const
-
{
-
return(c.size());
-
}
-
-
const_referencetop()const
-
{
-
return(c.front());
-
}
-
-
referencetop()
-
{
-
return(c.front());
-
}
-
-
voidpush(constvalue_type&_Pred)
-
{
-
c.push_back(_Pred);
-
push_heap(c.begin(),c.end(),comp);
-
}
-
-
voidpop()
-
{
-
pop_heap(c.begin(),c.end(),comp);
-
c.pop_back();
-
}
-
-
protected:
-
_Containerc;
-
_Prcomp;
-
};
下面先给出优级先级队列的使用范例。
-
-
-
-
#include<queue>
-
#include<list>
-
#include<cstdio>
-
usingnamespacestd;
-
intmain()
-
{
-
-
priority_queue<int>a;
-
priority_queue<int,list<int>>b;
-
inti;
-
-
for(i=0;i<10;i++)
-
{
-
a.push(i*2-5);
-
-
}
-
-
printf("%d\n",a.size());
-
-
while(!a.empty())
-
{
-
printf("%d",a.top());
-
a.pop();
-
}
-
putchar('\n');
-
return0;
-
}
下面程序是针对结构体的,对数据的比较是通过对结构体重载operator()。
程序功能是模拟排队过程,每人有姓名和优先级,优先级相同则比较姓名,开始有5个人进入队列,然后队头2个人出队,再有3个人进入队列,最后所有人都依次出队,程序会输出离开队伍的顺序。
-
-
#include<queue>
-
#include<cstring>
-
#include<cstdio>
-
usingnamespacestd;
-
-
structNode
-
{
-
charszName[20];
-
intpriority;
-
Node(intnri,char*pszName)
-
{
-
strcpy(szName,pszName);
-
priority=nri;
-
}
-
};
-
-
structNodeCmp
-
{
-
booloperator()(constNode&na,constNode&nb)
-
{
-
if(na.priority!=nb.priority)
-
returnna.priority<=nb.priority;
-
else
-
returnstrcmp(na.szName,nb.szName)>0;
-
}
-
};
-
voidPrintfNode(Node&na)
-
{
-
printf("%s%d\n",na.szName,na.priority);
-
}
-
intmain()
-
{
-
-
priority_queue<Node,vector<Node>,NodeCmp>a;
-
-
-
a.push(Node(5,"小谭"));
-
a.push(Node(3,"小刘"));
-
a.push(Node(1,"小涛"));
-
a.push(Node(5,"小王"));
-
-
-
PrintfNode(a.top());
-
a.pop();
-
PrintfNode(a.top());
-
a.pop();
-
printf("--------------------\n");
-
-
-
a.push(Node(2,"小白"));
-
a.push(Node(2,"小强"));
-
a.push(Node(3,"小新"));
-
-
-
while(!a.empty())
-
{
-
PrintfNode(a.top());
-
a.pop();
-
}
-
-
return0;
-
}
读者可以将上面结构体Node改成类来试下,答案2天后发到本篇的评论中。
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6976468
分享到:
相关推荐
priority_queue用法,希望对大家会有所帮助
主要介绍了 STL priority_queue(优先队列)详解的相关资料,需要的朋友可以参考下
用于三维光学形貌扫描完成后,生成的stl文件的读取,并形成俯视投影云图
NX二次开发-UFUN导出STL函数UF_STD_put_solid_in_stl_file博客文章源代码
stlshow_stl分层_STL分层_stlmatlab_STL切片_stl分层_源码.rar.rar
priority_queue 源码
最新的STL源码,最新的STL源码,最新的STL源码
stlshow_stl分层_STL分层_stlmatlab_STL切片_stl分层.zip
上传stl文件,等到模型的体积、尺寸等参数
dheap(插入元素)、pop_max_dheap(删除最大元素)、pop_min_dheap(删除最小元素),is_dheap(堆验证)五个泛型算法,在此基础上实现了一个能在对数时间内获取最大和最小元素的优先级队列,相当于原stl优先级队列...
西门子S7-300语句表 STL 实例源代码
用于STL文件读取与显示的C语言程序,简单方便实用。
stl转换,能够有效的将matlab 转化为stl文件,用于3DMAX的绘图
VC++利用动态连接库开发的读取STL格式文件的界面,可鼠标点选,旋转物体,有需要的朋友可以下载
C++读取STL文件,输出所有三角形的顶点坐标
打开stl文件,将其还原为3d实体并在3d场景中显示。同时,在数组中显示3d顶点xyz和法向量。点击模拟来观察3d恢复过程。
读取 点云数据 STL 文件 分块化编程
STL文件读取程序(Matlab):可以将ASCII格式的的STL文件中的数据点信息及网格拓扑信息读出,并显示在屏幕上
看STL文件的小软件,可以自由的实现旋转,等功能,现在只是一小部分,以后会发后面的
心希盼 C++ STL Queue(队列)