码迷,mamicode.com
首页 > 其他好文 > 详细

STL之容器适配器priority_queue

时间:2016-11-21 07:48:43      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:完全   include   algorithm   tor   queue   div   style   特性   第一个   

  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

标签:完全   include   algorithm   tor   queue   div   style   特性   第一个   

原文地址:http://www.cnblogs.com/xiguas/p/6083981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!