STL之容器适配器priority_queue

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL之容器适配器priority_queue相关的知识,希望对你有一定的参考价值。

  priority_queue(优先队列)是一个拥有权值观念的queue,它允许加入新元素,删除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素, 除此之外别无其它存取元素的途径。

  缺省情况下priority_queue系列利用一个max_heap(最大堆)完成,后者是一个以vector表现的完全二叉树。Max_heap可以满足priority_queue所需要的“依权值高低自动递减排序”的特性。

             技术分享

 

  priority_queue完全以底部容器为根据,再加上heap处理规则,所以其实现非常简单,这里给出其模板声明:

 

template <class T, class Sequence = vector<T>, class Compare = less<typename Sequence::value_type>>
class priority_queue {
   //
protected:
    Sequence c;   // 底层容器
    Compare comp; // 元素大小比较标准
   //
};

  priority_queue模板有3个参数,第一个为元素类型,第二个为指定底层容器,默认为vector,第三个为内部元素比较函数,默认为标准库内置关系运算类仿函数less, 顺便把less的模板找出来看看:

template<class T>
struct less : public binary_function<T, T, bool>
{
         bool operator() (const T& x, const T& y)  { return x < y;}
};

  类似内置关系运算仿函数一共6个,为别为:

等于            equal_to<T>
不等于          not_equal_to<T>
大于            greater<T>
大于或等于       greater_equal<T>
小于            less<T>
小于或等于       less_equal<T>

  之后会单独将仿函数详细介绍下,这里只做相关了解。

  下面给出测试代码:

#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int ia[9] = {0,1,2,3,4,8,9,3,5};
    priority_queue<int> ipq(ia, ia+9);
    cout << "size = " << ipq.size() << endl;    // size = 9
    
    for (int i = 0; i < ipq.size(); i++) {      
        cout << ipq.top() <<  ;               // 9 9 9 9 9 9 9 9 9
    }
    cout << endl;
    
    while (!ipq.empty()) {
        cout << ipq.top() <<  ;               // 9 8 5 4 3 3 2 1 0
        ipq.pop();
    }
    cout << endl;
    
    return 0;
}

以上是关于STL之容器适配器priority_queue的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL priority_queue容器适配器详解

STL源码分析之heap和priority_queue

[ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解

[C/C++]详解STL容器3--stackqueue和priority_queue的功能和模拟实现,deque和容器适配器的介绍

STL之优先级队列priority_queue

STL容器学习总结