C++ STL 优先队列 (priority_queue)

std::priority_queue

<queue>

优先队列

  1、第一个元素始终为最大元素。

  2、有着类似于堆的特性,它可以在其中随时插入元素。

  3、支持下标访问(随机访问迭代器)

优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问迭代器访问,并需要支持以下操作

  • empty( )

  • size( )

  • front( )

  • push_back( )

  • pop_back( )

     显而易见的是有dequevector这两个基础容器支持以上操作

     所以在默认情况下,如果未为priority_queue指定基础容器类,则将使用vector

成员函数

(constructor) Construct priority queue (public member function )
empty 优先队列是否为空
size 返回优先队列的当前元素个数
top 访问顶部元素(返回顶部元素的常量引用)
push 插入一个元素
pop 删除顶部元素
emplace 构造并插入一个元素
void swap (priority_queue& x) 交换两个队列的内容

注:
1、emplace 与 push 相比更加优化了对内存空间的使用,具体可以另行查询
2、swap 是交换两个同一类型的优先队列内的所有元素,如 a.swap ( x ) 即交换队列 a 和 x 的所有元素

构造优先队列

        <queue>
/* 1 */ priority_queue<int> pq1;                         //默认大根堆且默认基础容器为vector
/* 2 */ priority_queue<vector<int>, less<int> > pq2;     //与 1 的性质一模一样
/* 3 */ priority_queue<deque<int>, greater<int> > pq3;   //小根堆且基础容器为deque

注意:大根堆为less,小根堆为greater

函数成员用例

1、push、top、empty、pop、大根堆

(1)int
#include <iostream>
#include <queue>

using namespace std;

int main ( void )
{
    priority_queue<int> pq; //大根堆,默认降序(大的在前,小的在后)

    pq.push ( 60 );
    pq.push ( 20 );
    pq.push ( 40 );
    pq.push ( 1 );
    pq.push ( 25 );

    while ( !pq.empty() ) // pq不为空则循环
    {
        cout << pq.top() << " "; //添加新元素
        pq.pop();    //弹出头元素
    }

    return 0;
}
(2)string
#include <iostream>
#include <queue>

using namespace std;

int main ( void )
{
    priority_queue<string> pq; //大根堆,默认降序(大的在前,小的在后)

    pq.push ( "abc" );
    pq.push ( "abd" );
    pq.push ( "acd" );
    pq.push ( "cda" );
    pq.push ( "abcd" );

    while ( !pq.empty() ) // pq不为空则循环
    {
        cout << pq.top() << endl; //添加新元素
        pq.pop();    //弹出头元素
    }

    return 0;
}

输出按字典序

2、swap、emplace、小根堆

(1)输入输出
#include <iostream>
#include <queue>

using namespace std;

int main ( void )
{
    priority_queue<int, vector<int>, greater<int> > pq1; //小根堆,默认降序(小的在前,大的在后)

    pq1.emplace ( 5 );
    pq1.emplace ( 4 );
    pq1.emplace ( 3 );
    pq1.emplace ( 2 );
    pq1.emplace ( 1 );    

    priority_queue<int, vector<int>, greater<int> > pq2;

    pq2.emplace ( 5 * 2 );
    pq2.emplace ( 4 * 2 );
    pq2.emplace ( 3 * 2 );
    pq2.emplace ( 2 * 2 );
    pq2.emplace ( 1 * 2 );

    cout << "pq1:" << endl;
    while ( !pq1.empty() ) // pq不为空则循环
    {
        cout << pq1.top() << " "; //添加新元素
        pq1.pop();    //弹出头元素
    }

    cout << endl << "pq2:" << endl;
    while ( !pq2.empty() ) // pq不为空则循环
    {
        cout << pq2.top() << " "; //添加新元素
        pq2.pop();    //弹出头元素
    }
    cout << endl;

    return 0;
}
(2)利用swap高效地清空队列
void clear( priority_queue<int> &pq ) {
    priority_queue<int> empty;
    pq.swap ( empty );
}
(3)利用=高效地清空队列
void clear( priority_queue<int> &pq ) {
    priority_queue<int> t;
    pq = t;
}
(0)

相关推荐

  • 每日一题 剑指offer(用两个栈实现队列)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • ​LeetCode刷题实战225:用队列实现栈

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • STL简介

    一.基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. ...

  • MFC&ATL&STL比较

    大量的程序员都尽可能多地利用现有的代码.程序员经常购买那些包装成库的代码,而且许多成功的公司正是靠生产真正优秀的代码库而发展起来的,例如rogue wave software (www.roguewa ...

  • R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

    原文链接:http://tecdat.cn/?p=22632 这篇文章描述了一种对涉及季节性和趋势成分的时间序列的中点进行建模的方法.我们将对一种叫做STL的算法进行研究,STL是 "使用_ ...

  • 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...

  • 倾斜摄影三维模型输出OSGB格式数据和OBJ,FBX,STL

    在倾斜摄影三维数据中,OSGB数据居多.航拍的影像经过建模软件处理产出之时,有很多成果的数据需要我们去选择输出,对于不同的项目需求,我们需要选择合适的输出数据格式.他们之间有什么区别?分别是应用在哪些 ...

  • C++ STL详解

    转载自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 一.STL简介 STL(Standard Template L ...

  • 【c++标准库笔记(三)侯捷老师课程】STL容器分类与各种测试(附代码及测试截图)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_42812128/article/ ...

  • C++STL与泛型编程(3)容器之分类与测试

    2020-04-06 16:53:48 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

  • 侯捷STL学习笔记(三)

    侯捷STL学习笔记(三)--序列容器测试 小麦大大 2018-08-24 04:38:49 166 收藏 1 分类专栏: C++ 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...