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()可以类比于堆结构。
用法模板
template< class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type> > class priority_queue;
这里的compare是比较函数,可以根据需求选取不同的自带的比较函数,也可以根据自己的需求编写比较函数。
这里可以先看一个priority_queue的应用例子
template<typename T> void print_queue(T q) { // NB: pass by value so the print uses a copy while(!q.empty()) { std::cout << q.top() << ' '; q.pop(); } std::cout << '\n'; } int main() { std::priority_queue<int> q; const auto data = {1,8,5,6,3,4,0,9,7,2}; for(int n : data) q.push(n); print_queue(q); std::priority_queue<int, std::vector<int>, std::greater<int>> q2(data.begin(), data.end()); print_queue(q2); // Using lambda to compare elements. auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); }; std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp); for(int n : data) q3.push(n); print_queue(q3); }
运行以后的输出是:
9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 8 9 6 7 4 5 2 3 0 1
根据compare结果,会将比较后的winner放在队列的最后。
这个与sort函数刚好相反
class Solution { public: void print_queue(vector<int>& q) { // NB: pass by value so the print uses a copy for(auto & ele : q){ std::cout<<ele<<' '; } std::cout << '\n'; } vector<int> sortArray(vector<int>& nums) { sort(nums.begin(), nums.end(), less()); print_queue(nums); sort(nums.begin(), nums.end(), greater()); print_queue(nums); return nums; } };
输出:
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0
可以看出sort函数输出的结果会将winnter置于数组的最前端,这里在使用的时候需要注意。