优先队列和结构体重载(详解)

优先队列计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用来实现。

优先队列至少需要支持下述操作:

  • 插入带优先级的元素(insert_with_priority)
  • 取出具有最高优先级的元素(pull_highest_priority_element)
  • 查看最高优先级的元素(peek):O(1) 时间复杂度

其它可选的操作:

  • 检查优先级高的一批元素
  • 清空优先队列
  • 批插入一批元素
  • 合并多个优先队列
  • 调整一个元素的优先级

优先队列的定义和基本操作

priority_queue<node> q;
q.empty()          如果队列为空,则返回true,否则返回false
 
q.size()           返回队列中元素的个数
 
q.pop()            删除队首元素,但不返回其值
 
q.top()            返回具有最高优先级的元素值,但不删除该元素
 
q.push()       在基于优先级的适当位置插入新元素

可以看出,优先队列的操作和基本的队列的操作稍有区别。

优先级问题

默认优先级

通过<操作符可知在整数中元素大的优先级高。

自定义优先级

struct node
{
    int value;
    //按照value的值大的优先
    friend bool operator<(node x, node y) {
        return x.value < y.value;
    }
    node(int value) : value(value){}
};
struct node
{
    int value;
    //默认的是最大顶堆,所以value属于top
    bool operator < (node x) const {
            return x.value < value;      //从小到大排序
        }
    node(int value) : value(value){}
};

个人理解:第一种是x相当于队列头,返回的是比队列头大的值。

第二种,value是队列头,返回的是比队列头小的值,所以是从小到大排序。

/*
* @Author: wfy
* @Date:   2020-03-10 10:30:44
* @Last Modified by:   wfy
* @Last Modified time: 2020-03-10 10:30:44
*/
#include <bits/stdc++.h>
using namespace std;
struct node
{
    int value;
    //按照value的值大的优先
    friend bool operator<(node x, node y) {
        return x.value < y.value;
    }
    node(int value) : value(value){}
};
int main(int argc, char const *argv[])
{
    priority_queue<node> p;
    p.push(node(1));
    p.push(node(0));
    p.push(node(3));
    node a = p.top();
    printf("%d", a.value);
    p.pop();
    printf("%d", p.top().value);
    return 0;
}
/*
* @Author: wfy
* @Date:   2020-03-10 10:30:44
* @Last Modified by:   wfy
* @Last Modified time: 2020-03-10 10:30:44
*/
#include <bits/stdc++.h>
using namespace std;
struct node
{
    int value;
    //默认的是最大顶堆,所以value属于top
    bool operator < (node x) const {
            return x.value < value;      //从小到大排序
        }
    node(int value) : value(value){}
};
int main(int argc, char const *argv[])
{
    priority_queue<node> p;
    p.push(node(1));
    p.push(node(0));
    p.push(node(3));
    node a = p.top();
    printf("%d", a.value);
    p.pop();
    printf("%d", p.top().value);
    return 0;
}
发布了67 篇原创文章 · 获赞 22 · 访问量 7160

猜你喜欢

转载自blog.csdn.net/weixin_43906799/article/details/104768586