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;
}
时间: 2024-08-09 10:53:45

STL之容器适配器priority_queue的相关文章

STL之容器适配器priority_queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 在前面的文章STL之heap相关操作算法中介绍了堆的相关操作算法,由于堆的注意主要作用是用于排序,我们也知道堆排序的时间复杂度为o(nlogn),是一种不稳定的排序算法,利用堆这一数据结构,我们可以很快第获取一个大数据中最大(或最小)的k个数.同时,上篇文章中,也提出了相关heap算法的一些问题. 问题1:在调用push_heap函数实现向堆中插入元素之前,我们必须要先将向底层容器的末端插入该元素,然后才能调用push_heap内部的向上调整来

初探STL之容器适配器

容器适配器 特点 用某种顺序容器来实现(让已有的顺序容器以栈/队列的方式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数

STL之容器适配器queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是如何借助基础容器实现一种常用的数据结构stack (栈),本文介绍下另外一种STL内部定义的另外一种STL容器适配器queue(队列). 对于接触过数据结构的人来说,队列并不陌生,它是一种FIFO(first in first out)的数据结构.与栈相比,队列的不同之处在于:(1)队列是一种先进先出的数据结构,而栈则是一种后进先出的数据结构:(2)队列支持首尾两端的访问操作,而栈

初步STL该容器适配器

容器适配器 特点 容器一定的顺序来实现(让现有的以集装箱堆放/式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数据结构

容器适配器————priority_queue

#include <queue> priority_queue 容器适配器定义了一个元素有序排列的队列.默认队列头部的元素优先级最高.因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理.但是如何定义“优先级”完全取决于我们自己. priority_queue<Type, Container, Functional> Type 就是数据类型, Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等

STL之容器适配器stack的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现数模转化和模数转化,在client,它能够将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的样例来说明"适配器"的含义.相信在我们每一个人的家里都有插排,如果就这么一种情况.如今我们家里的墙壁上仅仅有一个三角的插口,而我们的电视却是两个口,怎么办

容器适配器、STL算法简介

可以用某种顺序容器来实现 (让已有的顺序容器以栈/队列的方式工作) 1) stack: 头文件 <stack> 栈 -- 后进先出 2) queue: 头文件 <queue> 队列 -- 先进先出 3) priority_queue: 头文件 <queue> 优先级队列 -- 最高优先级元素总是第一个出列 都有3个成员函数: push: 添加一个元素; top: 返回栈顶部或队头元素的引用 pop: 删除一个元素 容器适配器上没有迭代器 STL中各种排序, 查找, 变序

5.0 容器适配器

STL中容器适配器有stack  queue  priority_queue共三种.他们都是在顺序容器的基础上实现的,屏蔽了顺序容器的一部分功能,突出或增加了另一些功能.容器适配器都有三个成员函数:push ,pop,top. 1)push:添加一个元素 2)top:返回顶部(对stack)或队头(对queue,priority_queue)的元素的引用. 3)pop:删除一个元素. 容器适配器上是没有迭代器的,所以在STL中的各种排序,查找,变序算法都不适用于容器适配器.

C++ Primer 学习笔记_55_STL剖析(十):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

七种基本容器:vector.deque.list.set.multiset.map.multimap 一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/deque/list对象创建了一个先进后出容器:queue是用deque或list对象创建了一个先进先出容器:priority_queue是用vector/deque创建了一个排序队列,内部用二叉堆实