经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++ STL 优先队列 (priority_queue)
来源:cnblogs  作者:Jude_Zhang  时间:2021/1/25 11:24:06  对本文有异议

std::priority_queue

<queue>

优先队列

1、第一个元素始终为最大元素。

2、有着类似于堆的特性,它可以在其中随时插入元素。

3、支持下标访问(随机访问迭代器)

优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问迭代器访问,并需要支持以下操作

  • empty( )

  • size( )

  • front( )

  • push_back( )

  • pop_back( )

?? 显而易见的是有dequevector这两个基础容器支持以上操作

?? 所以在默认情况下,如果未为priority_queue指定基础容器类,则将使用vector

成员函数

(constructor) Construct priority queue (public member function )
empty 优先队列是否为空
size 返回优先队列的当前元素个数
top 访问顶部元素(返回顶部元素的常量引用)
push 插入一个元素
pop 删除顶部元素
emplace 构造并插入一个元素
void swap (priority_queue& x) 交换两个队列的内容

注:
1、emplace 与 push 相比更加优化了对内存空间的使用,具体可以另行查询
2、swap 是交换两个同一类型的优先队列内的所有元素,如 a.swap ( x ) 即交换队列 a 和 x 的所有元素

构造优先队列

  1. <queue>
  2. /* 1 */ priority_queue<int> pq1; //默认大根堆且默认基础容器为vector
  3. /* 2 */ priority_queue<vector<int>, less<int> > pq2; //与 1 的性质一模一样
  4. /* 3 */ priority_queue<deque<int>, greater<int> > pq3; //小根堆且基础容器为deque

注意:大根堆为less,小根堆为greater

函数成员用例

1、push、top、empty、pop、大根堆

(1)int
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<int> pq; //大根堆,默认降序(大的在前,小的在后)
  7. pq.push ( 60 );
  8. pq.push ( 20 );
  9. pq.push ( 40 );
  10. pq.push ( 1 );
  11. pq.push ( 25 );
  12. while ( !pq.empty() ) // pq不为空则循环
  13. {
  14. cout << pq.top() << " "; //添加新元素
  15. pq.pop(); //弹出头元素
  16. }
  17. return 0;
  18. }



(2)string
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<string> pq; //大根堆,默认降序(大的在前,小的在后)
  7. pq.push ( "abc" );
  8. pq.push ( "abd" );
  9. pq.push ( "acd" );
  10. pq.push ( "cda" );
  11. pq.push ( "abcd" );
  12. while ( !pq.empty() ) // pq不为空则循环
  13. {
  14. cout << pq.top() << endl; //添加新元素
  15. pq.pop(); //弹出头元素
  16. }
  17. return 0;
  18. }

输出按字典序

2、swap、emplace、小根堆

(1)输入输出
  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main ( void )
  5. {
  6. priority_queue<int, vector<int>, greater<int> > pq1; //小根堆,默认降序(小的在前,大的在后)
  7. pq1.emplace ( 5 );
  8. pq1.emplace ( 4 );
  9. pq1.emplace ( 3 );
  10. pq1.emplace ( 2 );
  11. pq1.emplace ( 1 );
  12. priority_queue<int, vector<int>, greater<int> > pq2;
  13. pq2.emplace ( 5 * 2 );
  14. pq2.emplace ( 4 * 2 );
  15. pq2.emplace ( 3 * 2 );
  16. pq2.emplace ( 2 * 2 );
  17. pq2.emplace ( 1 * 2 );
  18. cout << "pq1:" << endl;
  19. while ( !pq1.empty() ) // pq不为空则循环
  20. {
  21. cout << pq1.top() << " "; //添加新元素
  22. pq1.pop(); //弹出头元素
  23. }
  24. cout << endl << "pq2:" << endl;
  25. while ( !pq2.empty() ) // pq不为空则循环
  26. {
  27. cout << pq2.top() << " "; //添加新元素
  28. pq2.pop(); //弹出头元素
  29. }
  30. cout << endl;
  31. return 0;
  32. }

(2)利用swap高效地清空队列
  1. void clear( priority_queue<int> &pq ) {
  2. priority_queue<int> empty;
  3. pq.swap ( empty );
  4. }

原文链接:http://www.cnblogs.com/judezhang/p/14310196.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号