美文网首页
C++ STL priority_queue 使用说明

C++ STL priority_queue 使用说明

作者: book_02 | 来源:发表于2020-03-14 10:54 被阅读0次

    说明

    优先队列std::priority_queue 可用于构造堆。

    比如:
    大顶堆:priority_queue<int> q;,大的数在前边。
    小顶堆: priority_queue<int, vector<int>, greater<int> > q;,小的数在前边。

    std::priority_queue是个模板类,如下:

    template<
        class T,
        class Container = std::vector<T>,
        class Compare = std::less<typename Container::value_type>
    > class priority_queue;
    

    有3个模板参数,其中后两个都有默认值。第1个参数是数据类型,比如int。第2个参数是用于存储元素的底层容器类型,默认是用vector。第3个参数是比较函数,默认是less,所以默认是大顶堆,大的在前边。

    第2个容器参数,vectordeque满足使用要求,如果是要自己编写的容器代码,则要求自己写的容器代码能最忌访问,且有如下接口:empty(); size(); front(); push_back(); pop_back()。日常使用,使用vector即可。

    头文件

    #include <queue>

    基本操作

    操作 说明
    top 访问栈顶元素
    empty 检查底层的容器是否为空
    size 返回容纳的元素数
    push 插入元素,并对底层容器排序
    pop 删除栈顶元素
    swap 两个priority queue交换内容
    emplace(c++11引入) 原位构造元素并排序底层容器

    其中emplacec++11引入,功能与push一致,但是效率更高,原地构造,不涉及copymove操作。

    例子:大顶堆

    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
        priority_queue<int> pq;
        pq.push(30);
        pq.push(100);
        pq.push(25);
        pq.push(40);
    
        // output
        while (!pq.empty()) {
            cout << pq.top() << "\t";
            pq.pop();
        }
        cout << endl;
    
        return 0;
    }
    

    结果如下:

    100     40      30      25
    

    例子:小顶堆

    #include <iostream>
    #include <queue>
    #include <functional>
    
    using namespace std;
    
    int main()
    {
        priority_queue<int, vector<int>, greater<int> > pq;
        pq.push(30);
        pq.push(100);
        pq.push(25);
        pq.push(40);
    
        // output
        while (!pq.empty()) {
            cout << pq.top() << "\t";
            pq.pop();
        }
        cout << endl;
    
        return 0;
    }
    

    结果如下:

    25      30      40      100
    

    例子:自定义排序函数

    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    class A {
    public:
        A(int key1, int key2) : key1_(key1), key2_(key2) {}
    
        bool operator<(const A& other) const {
            return (key2_ < (other.key2_));
        }
    
        void print() const {
            cout << key1_ << "\t" << key2_ << endl;
        }
    
    private:
        int key1_;
        int key2_;
    };
    
    int main()
    {
        priority_queue<A> pq;
        pq.emplace(25, 26);
        pq.emplace(100, 7);
        pq.emplace(30, 63);
        pq.emplace(40, 6);
    
        // output
        while (!pq.empty()) {
            pq.top().print();
            pq.pop();
        }
        cout << endl;
    
        return 0;
    }
    

    结果如下:

    30      63
    25      26
    100     7
    40      6
    
    

    通过operator<自定义排序函数,按照key2_从大到小排序。
    其中使用了emplace,也可换成pq.push(A(25, 26));

    参考

    http://www.cplusplus.com/reference/queue/priority_queue/
    https://zh.cppreference.com/w/cpp/container/priority_queue

    相关文章

      网友评论

          本文标题:C++ STL priority_queue 使用说明

          本文链接:https://www.haomeiwen.com/subject/syvmshtx.html