ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

优先队列priority_queue

2021-02-08 22:34:33  阅读:169  来源: 互联网

标签:queue 容器 队列 top 元素 priority size


template <typename T,
        typename Container=std::vector<T>,
        typename Compare=std::less<T> >
class priority_queue{
    //......
}

可以看到,priority_queue 容器适配器模板类最多可以传入 3 个参数,它们各自的含义如下:

typename T:指定存储元素的具体类型;

typename Container:指定 priority_queue 底层使用的基础容器,默认使用 vector 容器。

作为 priority_queue 容器适配器的底层容器,其必须包含 empty()、size()、front()、push_back()、pop_back() 这几个成员函数,STL 序列式容器中只有 vector 和 deque 容器符合条件。

typename Compare:指定容器中评定元素优先级所遵循的排序规则,默认使用std::less按照元素值从大到小进行排序,还可以使用std::greater按照元素值从小到大排序,但更多情况下是使用自定义的排序规则。其中,std::less 和 std::greater 都是以函数对象的方式定义在 头文件中。关于如何自定义排序规则,后续章节会做详细介绍。

				priority_queue 提供的成员函数
成员函数功能
empty()如果 priority_queue 为空的话,返回 true;反之,返回 false。
size()返回 priority_queue 中存储元素的个数。
top()返回 priority_queue 中第一个元素的引用形式。
push(const T& obj)根据既定的排序规则,将元素 obj 的副本存储到 priority_queue 中适当的位置。
push(T&& obj)根据既定的排序规则,将元素 obj 移动存储到 priority_queue 中适当的位置。
emplace(Args&&… args)Args&&… args 表示构造一个存储类型的元素所需要的数据(对于类对象来说,可能需要多个数据构造出一个对象)。此函数的功能是根据既定的排序规则,在容器适配器适当的位置直接生成该新元素。
pop()移除 priority_queue 容器适配器中第一个元素。
swap(priority_queue& other)将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

和 queue 一样,priority_queue 也没有迭代器,因此访问元素的唯一方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素。

#include <queue>
using namespace std;
  1. 创建一个空的 priority_queue 容器适配器,第底层采用默认的 vector 容器,排序方式也采用默认的 std::less 方法:
#include<iostream>
#include<vector>
#include <queue>
#include <array>
#include<cstdio>
#include<string>
using namespace std;
template<typename T>
void output(priority_queue<T> &que) {
    while(!que.empty()) {
        T top = que.top();
        que.pop();
        cout << "top: " << top << " " << "size: " << que.size() << endl;
    }
    cout << endl << endl;
}

template<typename T>
void output(priority_queue<T, deque<T>, greater<T> > &que) {
    while(!que.empty()) {
        T top = que.top();
        que.pop();
        cout << "top: " << top << " " << "size: " << que.size() << endl;
    }
    cout << endl << endl;
}


int main() {
    priority_queue<int> que1;
    int values[]{1, 2, 3};
    priority_queue<int> que2(values, values + 4);
    array<int, 4> arr{1, 3, 2, 4};
    priority_queue<int> que3(arr.begin(), arr.end());
    output(que3);//默认将序

    priority_queue<int, deque<int>, greater<int> > que4;
    que4.push(5);
    que4.push(2);
    que4.push(7);
    output(que4);

    return 0;
}

运行结果

` ``cpp
top: 4 size: 3
top: 3 size: 2
top: 2 size: 1
top: 1 size: 0

top: 2 size: 2
top: 5 size: 1
top: 7 size: 0



标签:queue,容器,队列,top,元素,priority,size
来源: https://blog.csdn.net/weixin_43117602/article/details/113763112

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有