• 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;
    }
    
    作者:Jude_Zhang
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    终于等到你---订餐系统之负载均衡(nginx+memcached+ftp上传图片+iis)
    订餐系统之同步饿了么商家订单
    订餐系统之同步口碑外卖商家菜单与点点送订单
    基于SuperSocket的IIS主动推送消息给android客户端
    基于mina框架的GPS设备与服务器之间的交互
    订餐系统之微信支付,踩了官方demo的坑
    订餐系统之自动确认淘点点订单
    订餐系统之Excel批量导入
    移除首页->重回首页
    订餐系统之获取淘宝外卖订单
  • 原文地址:https://www.cnblogs.com/judezhang/p/14310196.html
Copyright © 2020-2023  润新知