• 优先队列(priority_queue)用法详解


    c++优先队列(priority_queue)用法详解_c++ 优先队列_吕白_的博客-CSDN博客

    既然是队列那么先要包含头文件#include , 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

    优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的

    • top 访问队头元素
    • empty 队列是否为空
    • size 返回队列内元素个数
    • push 插入元素到队尾 (并排序)
    • emplace 原地构造一个元素并插入队列
    • pop 弹出队头元素
    • swap 交换内容

    定义:priority_queue
    Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆,头顶元素最大,由大到小排序

    基本类型

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //对于基础类型 默认是大顶堆
    7. priority_queue<int> a;
    8. //等同于 priority_queue, less > a;
    9. //由大到小排序
    10. priority_queue<int, vector<int>, greater<int> > c; //这样就是小顶堆
    11. //由小到大排序
    12. priority_queue b;
    13. for (int i = 0; i < 5; i++)
    14. {
    15. a.push(i);
    16. c.push(i);
    17. }
    18. while (!a.empty())
    19. {
    20. cout << a.top() << ' ';
    21. a.pop();
    22. }
    23. cout << endl;
    24. /*
    25. 输出:4 3 2 1 0
    26. */
    27. while (!c.empty())
    28. {
    29. cout << c.top() << ' ';
    30. c.pop();
    31. }
    32. cout << endl;
    33. /*
    34. 输出:0 1 2 3 4
    35. */
    36. b.push("abc");
    37. b.push("abcd");
    38. b.push("cbd");
    39. while (!b.empty())
    40. {
    41. cout << b.top() << ' ';
    42. b.pop();
    43. }
    44. cout << endl;
    45. /*
    46. 输出:cbd abcd abc
    47. */
    48. system("pause");
    49. return 0;
    50. }

    pair比较

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. priority_queueint, int> > a;
    8. pair<int, int> b(1, 2);
    9. pair<int, int> c = make_pair(1, 2);
    10. a.push(b);
    11. a.push(c);
    12. a.push(pair<int, int> (1, 3));
    13. a.push(make_pair(2,5));
    14. while (!a.empty())
    15. {
    16. cout << a.top().first << ' ' << a.top().second << '\n';
    17. a.pop();
    18. }
    19. /*
    20. 输出:
    21. 2 5
    22. 1 3
    23. 1 2
    24. 1 2
    25. */
    26. system("pause");
    27. return 0;
    28. }

    自定义数据类型

    1. #include
    2. #include
    3. using namespace std;
    4. //方法1
    5. struct tmp1 //运算符重载<
    6. {
    7. int x;
    8. tmp1(int a) { x = a; }
    9. bool operator<(const tmp1& a) const
    10. {
    11. //return x < a.x; //大顶堆
    12. return x > a.x; //小顶堆
    13. }
    14. };
    15. //方法2
    16. struct tmp2 //重写仿函数
    17. {
    18. bool operator() (tmp1 a, tmp1 b)
    19. {
    20. //return a.x < b.x; //大顶堆
    21. return a.x > b.x; //小顶堆
    22. }
    23. };
    24. int main()
    25. {
    26. tmp1 a(3);
    27. tmp1 b(1);
    28. tmp1 c(2);
    29. priority_queue d;
    30. d.push(b);
    31. d.push(c);
    32. d.push(a);
    33. while (!d.empty())
    34. {
    35. cout << d.top().x << '\n';
    36. d.pop();
    37. }
    38. cout << endl;
    39. /*
    40. 输出1
    41. 2
    42. 3
    43. */
    44. system("pause");
    45. return 0;
    46. }
    47. ------------------------------------------------------------------------------------
    48. #include
    49. #include
    50. #include
    51. #include
    52. #include
    53. #include
    54. using namespace std;
    55. struct tmp1 //运算符重载<
    56. {
    57. int x;
    58. tmp1(int a) { x = a; }
    59. //bool operator<(const tmp1& a) const
    60. //{
    61. // //return x < a.x; //大顶堆
    62. // return x > a.x; //小顶堆
    63. //}
    64. };
    65. //方法2
    66. struct tmp2 //重写仿函数
    67. {
    68. bool operator() (tmp1 a, tmp1 b)
    69. {
    70. //return a.x < b.x; //大顶堆
    71. return a.x > b.x; //小顶堆
    72. }
    73. };
    74. int main()
    75. {
    76. tmp1 a(3);
    77. tmp1 b(1);
    78. tmp1 c(2);
    79. priority_queue, tmp2> f;// 放函数不可以
    80. f.push(c);
    81. f.push(b);
    82. f.push(a);
    83. while (!f.empty())
    84. {
    85. cout << f.top().x << '\n';
    86. f.pop();
    87. }
    88. /*
    89. 输出1
    90. 2
    91. 3
    92. */
    93. system("pause");
    94. return 0;
    95. }

  • 相关阅读:
    基于Openwrt系统架构,实现应用与驱动的实例。
    面向对象编程(C++篇4)——RAII
    函数调用时用const保护指针
    前端框架引入excel表格
    设计模式:享元模式案例
    【数据结构与算法】:带你手搓顺序表(C/C++篇)
    VS Code | 在VS Code中搭建你的R语言运行环境吧!~(图文介绍超详细)
    离线地图开发-含源代码(免费)
    JS优化技巧
    【Python数据分析】matplotlib绘图
  • 原文地址:https://blog.csdn.net/qq_37891604/article/details/133253864