当前位置:   article > 正文

C++ 优先队列(priority_queue)用法

C++ 优先队列(priority_queue)用法

A priority queue is a container adaptor that provides constant time lookup of the largest (by default) element, at the expense of logarithmic insertion and extraction.

 优先队列作为一种常用的容器,可以提供极值的快速查找功能。插入和抽取操作的消耗都是对数级别的。

优先队列也可以看作是最大堆或者最小堆的具体实现,所以该数据结构自带的top(), pop()可以类比于堆结构。

用法模板

  1. template<
  2. class T,
  3. class Container = std::vector<T>,
  4. class Compare = std::less<typename Container::value_type>
  5. > class priority_queue;

 这里的compare是比较函数,可以根据需求选取不同的自带的比较函数,也可以根据自己的需求编写比较函数。

这里可以先看一个priority_queue的应用例子

  1. template<typename T>
  2. void print_queue(T q) { // NB: pass by value so the print uses a copy
  3. while(!q.empty()) {
  4. std::cout << q.top() << ' ';
  5. q.pop();
  6. }
  7. std::cout << '\n';
  8. }
  9. int main() {
  10. std::priority_queue<int> q;
  11. const auto data = {1,8,5,6,3,4,0,9,7,2};
  12. for(int n : data)
  13. q.push(n);
  14. print_queue(q);
  15. std::priority_queue<int, std::vector<int>, std::greater<int>>
  16. q2(data.begin(), data.end());
  17. print_queue(q2);
  18. // Using lambda to compare elements.
  19. auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); };
  20. std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp);
  21. for(int n : data)
  22. q3.push(n);
  23. print_queue(q3);
  24. }

 运行以后的输出是:

  1. 9 8 7 6 5 4 3 2 1 0
  2. 0 1 2 3 4 5 6 7 8 9
  3. 8 9 6 7 4 5 2 3 0 1

根据compare结果,会将比较后的winner放在队列的最后。

这个与sort函数刚好相反

  1. class Solution {
  2. public:
  3. void print_queue(vector<int>& q) { // NB: pass by value so the print uses a copy
  4. for(auto & ele : q){
  5. std::cout<<ele<<' ';
  6. }
  7. std::cout << '\n';
  8. }
  9. vector<int> sortArray(vector<int>& nums) {
  10. sort(nums.begin(), nums.end(), less());
  11. print_queue(nums);
  12. sort(nums.begin(), nums.end(), greater());
  13. print_queue(nums);
  14. return nums;
  15. }
  16. };

输出:

  1. 0 1 2 3 4 5 6 7 8 9
  2. 9 8 7 6 5 4 3 2 1 0

可以看出sort函数输出的结果会将winnter置于数组的最前端,这里在使用的时候需要注意。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号