首页 > 编程语言 >C++ STL 优先队列 (priority_queue)

C++ STL 优先队列 (priority_queue)

时间:2024-07-02 23:42:30浏览次数:14  
标签:queue pq emplace STL C++ priority 队列 push

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;
}


注:转自C++ STL 优先队列 (priority_queue) - Jude_Zhang - 博客园 (cnblogs.com)

标签:queue,pq,emplace,STL,C++,priority,队列,push
From: https://www.cnblogs.com/Elysiaiii/p/18280747

相关文章

  • 【C++ | 继承】|概念、方式、特性、作用域、6类默认函数
    继承1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容派生类的创建和销毁构造函数拷贝构造赋值重载1.继承的概念与定义继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件......
  • C++字体库开发
    建议根据字体需求,多个组合使用。高度定制可基于freeType+harfbuzz基础库完成。GitHub-GNOME/pango:Read-onlymirrorofhttps://gitlab.gnome.org/GNOME/pangoGitHub-googlefonts/fontview:Demoappthatdisplaysfontswithafree/libre/open-sourcetextrenderi......
  • 车站选票代码分析与展示(C++版)
    目录程序的主要功能1.主窗口:2.管理员窗口:3.普通顾客窗口:主要数据结构函数间调用关系算法流程图1.查询算法流程图​编辑2.乘客买票算法流程图程序运行结果1.主窗口->管理员窗口a.管理员窗口->验证窗口b.管理员增加车次信息c.浏览全部车辆信息d.注销车次信息e.车......
  • C++基础(二):C++入门(二)
        上一篇博客我们正式进入C++的学习,这一篇博客我们继续学习C++入门的基础内容,一定要学好入门阶段的内容,这是后续学习C++的基础,方便我们后续更加容易的理解C++。目录一、内联函数1.0产生的原因1.1概念1.2特性1.3面试题二、缺省参数2.1缺省参数的概念2.2......
  • C++与C#创建位图,是否需要区分RGB和BGR模式
    在处理位图时,确实需要区分RGB和BGR模式,因为不同的库和API对颜色通道的排序有不同的约定。具体到C++与C#,这一点也是需要注意的。C++创建位图使用GDI+或WIC(WindowsImagingComponent):当你在C++中使用这些WindowsAPI创建或操作位图时,通常会指定像素格式,比如PixelFormat2......
  • C++定义函数指针,回调C#
    C++定义函数指针。typedefint(__stdcall*delegate_func)(inta,intb);暴露接口:int__stdcallCPPcallCSharp(delegate_funcfunc);方法实现:int__stdcallCPPcallCSharp(delegate_funcfunc){returnfunc(1,2);}头文件calculator.h#ifndefLIB_CALCULATOR_H#defin......
  • LeetCode 算法:二叉树展开为链表 c++
    原题链接......
  • A tour of C++ 读书笔记
    第一章:C++只是个编译型语言,需要源文件编译成目标文件,再通过链接各种库到可执行文件1.6常量  const  constexpr这个代表是要在编译的时候估值,性能会有所增加吧2.4联合体(union)  联合体所有的成员都是分配在同一地址上面,所以联合体所占的空间是跟其自身内部成员所......
  • 2024年华为OD机试真题-分披萨-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:“吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小......
  • C++那些事 研读...
    constthings1.const常量与#define宏定义常量区别const常量编译时期可以进行安全检查,#define宏定义并没有具体的数据类型,只是字符替换罢了,不能安全检查2.const与指针constchar*a;//指向constchar的指针charconst*a;//指向constchar的指针char*consta;//const......