标准模板库(STL)学习指南之priority_queue优先队列

简介:

转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016

priority_queue 调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法
实现,也算是堆的另外一种形式。

先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue  用法相
似的 priority_queue, 以加深对 priority_queue 的理解

 

  1. #include <iostream>  
  2. #include <algorithm>  
  3. #include <vector>  
  4. using namespace std;  
  5. class priority_queue  
  6. {  
  7.     private:  
  8.         vector<int> data;  
  9.           
  10.     public:  
  11.         void push( int t ){   
  12.             data.push_back(t);   
  13.             push_heap( data.begin(), data.end());   
  14.         }  
  15.           
  16.         void pop(){  
  17.             pop_heap( data.begin(), data.end() );  
  18.             data.pop_back();  
  19.         }  
  20.           
  21.         int top()    { return data.front(); }  
  22.         int size()   { return data.size();  }  
  23.         bool empty() { return data.empty(); }  
  24. };  
  25.   
  26. int main()  
  27. {  
  28.     priority_queue  test;  
  29.     test.push( 3 );  
  30.     test.push( 5 );  
  31.     test.push( 2 );  
  32.     test.push( 4 );  
  33.       
  34.     while( !test.empty() ){  
  35.         cout << test.top() << endl;  
  36.         test.pop(); }  
  37.           
  38.     return 0;  
  39. }  

 

 

STL里面的 priority_queue 写法与此相似,只是增加了模板及相关的迭代器什么的。


priority_queue 对于基本类型的使用方法相对简单。
他的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个
参数缺省的话,优先队列就是大顶堆,队头元素最大。
看例子

  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. int main(){  
  5.     priority_queue<int> q;  
  6.       
  7.     for( int i= 0; i< 10; ++i ) q.push( rand() );  
  8.     while( !q.empty() ){  
  9.         cout << q.top() << endl;  
  10.         q.pop();  
  11.     }  
  12.       
  13.     getchar();  
  14.     return 0;  
  15. }  
 
 
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
例子:
  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. int main(){  
  5.     priority_queue<int, vector<int>, greater<int> > q;  
  6.       
  7.     for( int i= 0; i< 10; ++i ) q.push( rand() );  
  8.     while( !q.empty() ){  
  9.         cout << q.top() << endl;  
  10.         q.pop();  
  11.     }  
  12.       
  13.     getchar();  
  14.     return 0;  
  15. }  
 
 
对于自定义类型,则必须自己重载 operator< 或者自己写仿函数
先看看例子:
  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. struct Node{  
  5.     int x, y;  
  6.     Node( int a= 0, int b= 0 ):  
  7.         x(a), y(b) {}  
  8. };  
  9. bool operator<( Node a, Node b ){  
  10.     if( a.x== b.x ) return a.y> b.y;  
  11.     return a.x> b.x;   
  12. }  
  13. int main(){  
  14.     priority_queue<Node> q;  
  15.       
  16.     for( int i= 0; i< 10; ++i )  
  17.     q.push( Node( rand(), rand() ) );  
  18.       
  19.     while( !q.empty() ){  
  20.         cout << q.top().x << ' ' << q.top().y << endl;  
  21.         q.pop();  
  22.     }  
  23.       
  24.     getchar();  
  25.     return 0;  
  26. }  
 
 

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义,如果想用这种方法定义
则可以按如下方式

例子:

 

  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. struct Node{  
  5.     int x, y;  
  6.     Node( int a= 0, int b= 0 ):  
  7.         x(a), y(b) {}  
  8. };  
  9. struct cmp{  
  10.     bool operator() ( Node a, Node b ){  
  11.         if( a.x== b.x ) return a.y> b.y;  
  12.           
  13.         return a.x> b.x; }  
  14. };  
  15. int main(){  
  16.     priority_queue<Node, vector<Node>, cmp> q;  
  17.       
  18.     for( int i= 0; i< 10; ++i )  
  19.     q.push( Node( rand(), rand() ) );  
  20.       
  21.     while( !q.empty() ){  
  22.         cout << q.top().x << ' ' << q.top().y << endl;  
  23.         q.pop();  
  24.     }  
  25.       
  26.     getchar();  
  27.     return 0;  
  28. }  

 

相关文章
Sendmail邮箱API发送邮件的步骤
AokSend教程:使用Sendmail API发送邮件涉及5步。1) 导入sendmail库;2) 连接SMTP服务器(如`smtp.sendmail.com:587`);3) 设置发件人(`sender@example.com`)和收件人(`recipient@example.com`);4) 编写邮件内容,包括主题和正文;5) 使用`sendmail.send()`发送邮件。AokSend提供高效、触达率高的触发式和SMTP/API接口,适合大规模验证码发信服务。
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
1964 11
|
人工智能 供应链 监控
数字供应链中的10个顶级成功案例
数字供应链中的10个顶级成功案例
|
机器学习/深度学习 存储 人工智能
《C++ 赋能强化学习:Q - learning 算法的实现之路》
本文探讨了如何用C++实现强化学习中的Q-learning算法。强化学习通过智能体与环境的交互来学习最优策略,Q-learning则通过更新Q函数估计动作回报。C++凭借高效的内存管理和快速执行,在处理大规模数据和复杂计算时表现出色。文章详细介绍了环境建模、Q表初始化、训练循环及策略提取等关键步骤,并分析了其在游戏开发、机器人控制等领域的应用前景,同时指出了可能面临的挑战及应对策略。
416 11
|
存储 数据管理 调度
HarmonyOS架构理解:揭开鸿蒙系统的神秘面纱
【10月更文挑战第21天】华为的鸿蒙系统(HarmonyOS)以其独特的分布式架构备受关注。该架构包括分布式软总线、分布式数据管理和分布式任务调度。分布式软总线实现设备间的无缝连接;分布式数据管理支持跨设备数据共享;分布式任务调度则实现跨设备任务协同。这些特性为开发者提供了强大的工具,助力智能设备的未来发展。
804 1
|
中间件 API C语言
详细解读CMSIS的相关知识
详细解读CMSIS的相关知识
441 0
|
vr&ar 开发者 C++
游戏开发丨基于Panda3D的迷宫小球游戏
游戏开发丨基于Panda3D的迷宫小球游戏
585 4
|
消息中间件 存储 Java
分布式事务在Java中的实现与优化
分布式事务在Java中的实现与优化
|
机器学习/深度学习 人工智能 自然语言处理
【活动】人工智能:前沿科技中的创业机遇与挑战
本文探讨了人工智能领域的创业机遇与挑战。AI技术的快速发展,如深度学习、自然语言处理等,已广泛应用于医疗、金融、制造等行业。未来创业机会包括AI基础设施、垂直行业解决方案、伦理安全领域及AI与其他技术的融合创新。然而,创业者需面对技术壁垒、数据获取、市场接受度、商业模式创新及政策伦理挑战。要在AI领域成功创业,需紧跟技术趋势,深挖行业需求,创新商业模式,并妥善应对各种挑战。
1086 6
|
编解码 安全 数据安全/隐私保护
速度与稳定性的完美结合:深入横测ToDesk、TeamViewer和AnyDesk
远程办公是指通过现代互联网技术,实现非本地办公:在家办公、异地办公、移动办公等远程办公模式。多数通过第三方远程控制软件来实现,例如通过远程手机/电脑远程控制办公设备进行工作或者会议,实现远程办公的目的。
2225 0
速度与稳定性的完美结合:深入横测ToDesk、TeamViewer和AnyDesk

热门文章

最新文章