`
阿尔萨斯
  • 浏览: 4179426 次
社区版块
存档分类
最新评论

STL系列之五 priority_queue 优先级队列

 
阅读更多

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 优先级队列的源代码

友情提示:初次阅读时请注意其实现思想,不要在细节上浪费过多的时间

  1. //VS2008中priority_queue的定义MoreWindows整理(http://blog.csdn.net/MoreWindows)
  2. template<class_Ty,class_Container=vector<_Ty>,class_Pr=less<typename_Container::value_type>>//默认以vector为容器的
  3. classpriority_queue
  4. {//priorityqueueimplementedwitha_Container
  5. public:
  6. typedef_Containercontainer_type;
  7. typedeftypename_Container::value_typevalue_type;
  8. typedeftypename_Container::size_typesize_type;
  9. typedeftypename_Container::referencereference;
  10. typedeftypename_Container::const_referenceconst_reference;
  11. priority_queue():c(),comp()
  12. {//constructwithemptycontainer,defaultcomparator
  13. }
  14. explicitpriority_queue(const_Pr&_Pred):c(),comp(_Pred)
  15. {//constructwithemptycontainer,specifiedcomparator
  16. }
  17. priority_queue(const_Pr&_Pred,const_Container&_Cont):c(_Cont),comp(_Pred)
  18. {//constructbycopyingspecifiedcontainer,comparator
  19. make_heap(c.begin(),c.end(),comp);//参见《STL系列之四heap堆的相关函数》
  20. }
  21. template<class_Iter>
  22. priority_queue(_Iter_First,_Iter_Last):c(_First,_Last),comp()
  23. {//constructbycopying[_First,_Last),defaultcomparator
  24. make_heap(c.begin(),c.end(),comp);
  25. }
  26. template<class_Iter>
  27. priority_queue(_Iter_First,_Iter_Last,const_Pr&_Pred):c(_First,_Last),comp(_Pred)
  28. {//constructbycopying[_First,_Last),specifiedcomparator
  29. make_heap(c.begin(),c.end(),comp);
  30. }
  31. template<class_Iter>
  32. priority_queue(_Iter_First,_Iter_Last,const_Pr&_Pred,const_Container&_Cont):c(_Cont),comp(_Pred)
  33. {//constructbycopying[_First,_Last),container,andcomparator
  34. c.insert(c.end(),_First,_Last);
  35. make_heap(c.begin(),c.end(),comp);
  36. }
  37. boolempty()const
  38. {//testifqueueisempty
  39. return(c.empty());
  40. }
  41. size_typesize()const
  42. {//returnlengthofqueue
  43. return(c.size());
  44. }
  45. const_referencetop()const
  46. {//returnhighest-priorityelement
  47. return(c.front());
  48. }
  49. referencetop()
  50. {//returnmutablehighest-priorityelement(retained)
  51. return(c.front());
  52. }
  53. voidpush(constvalue_type&_Pred)
  54. {//insertvalueinpriorityorder
  55. c.push_back(_Pred);
  56. push_heap(c.begin(),c.end(),comp);
  57. }
  58. voidpop()
  59. {//erasehighest-priorityelement
  60. pop_heap(c.begin(),c.end(),comp);
  61. c.pop_back();
  62. }
  63. protected:
  64. _Containerc;//theunderlyingcontainer
  65. _Prcomp;//thecomparatorfunctor
  66. };

下面先给出优级先级队列的使用范例。

  1. //优先级队列priority_queuebyMoreWindows(http://blog.csdn.net/MoreWindows)
  2. //支持empty()size()top()push()pop()与stack的操作函数全部一样
  3. //byMoreWindows
  4. #include<queue>
  5. #include<list>
  6. #include<cstdio>
  7. usingnamespacestd;
  8. intmain()
  9. {
  10. //优先级队列默认是使用vector作容器。
  11. priority_queue<int>a;
  12. priority_queue<int,list<int>>b;//可以这样声明,但无法使用
  13. inti;
  14. //压入数据
  15. for(i=0;i<10;i++)
  16. {
  17. a.push(i*2-5);
  18. //b.push(i);//编译错误
  19. }
  20. //优先级队列的大小
  21. printf("%d\n",a.size());
  22. //取优先级队列数据并将数据移出队列
  23. while(!a.empty())
  24. {
  25. printf("%d",a.top());
  26. a.pop();
  27. }
  28. putchar('\n');
  29. return0;
  30. }

下面程序是针对结构体的,对数据的比较是通过对结构体重载operator()。

程序功能是模拟排队过程,每人有姓名和优先级,优先级相同则比较姓名,开始有5个人进入队列,然后队头2个人出队,再有3个人进入队列,最后所有人都依次出队,程序会输出离开队伍的顺序。

  1. //byMoreWindows(http://blog.csdn.net/MoreWindows)
  2. #include<queue>
  3. #include<cstring>
  4. #include<cstdio>
  5. usingnamespacestd;
  6. //结构体
  7. structNode
  8. {
  9. charszName[20];
  10. intpriority;
  11. Node(intnri,char*pszName)
  12. {
  13. strcpy(szName,pszName);
  14. priority=nri;
  15. }
  16. };
  17. //结构体的比较方法改写operator()
  18. structNodeCmp
  19. {
  20. booloperator()(constNode&na,constNode&nb)
  21. {
  22. if(na.priority!=nb.priority)
  23. returnna.priority<=nb.priority;
  24. else
  25. returnstrcmp(na.szName,nb.szName)>0;
  26. }
  27. };
  28. voidPrintfNode(Node&na)
  29. {
  30. printf("%s%d\n",na.szName,na.priority);
  31. }
  32. intmain()
  33. {
  34. //优先级队列默认是使用vector作容器,底层数据结构为堆。
  35. priority_queue<Node,vector<Node>,NodeCmp>a;
  36. //有5个人进入队列
  37. a.push(Node(5,"小谭"));
  38. a.push(Node(3,"小刘"));
  39. a.push(Node(1,"小涛"));
  40. a.push(Node(5,"小王"));
  41. //队头的2个人出队
  42. PrintfNode(a.top());
  43. a.pop();
  44. PrintfNode(a.top());
  45. a.pop();
  46. printf("--------------------\n");
  47. //再进入3个人
  48. a.push(Node(2,"小白"));
  49. a.push(Node(2,"小强"));
  50. a.push(Node(3,"小新"));
  51. //所有人都依次出队
  52. while(!a.empty())
  53. {
  54. PrintfNode(a.top());
  55. a.pop();
  56. }
  57. return0;
  58. }

读者可以将上面结构体Node改成类来试下,答案2天后发到本篇的评论中。

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6976468

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics