优先队列priority_queue的 使用| 堆 | 仿函数

发布时间 2023-04-27 08:51:11作者: Jocelynn
在阅读使用分支限界法解决TSP问题时遇到了这样一段代码:
//排列树的节点定义
struct node
{
    int cl;//当前走过的路径长度
    int id;//处理的第几个城市
    int x[100];//记录当前路径,下标从1开始

    node() {}//默认构造函数,不提供任何参数,即通常的结构体用法
    node(int cl_, int id_) //结构体构造函数
    {
        cl = cl_;
        id = id_;
        memset(x, 0, sizeof(x));//将x的所有元素初始化为0
    }
};



//用于构建最小堆
struct cl_cmp {
    //当前路径长度短的优先级高
    bool operator()(node n1, node n2)
    {
        return n1.cl > n2.cl;
    }
};

void bfs()
{
    //选用最小堆
    priority_queue<node, vector<node>, cl_cmp> q;
//后面省略
}
 priority_queue<node, vector<node>, cl_cmp> q;  中的三个参数时什么意思?cl_cmp重载的()运算符又是什么作用?

我在网上查了一下priority_queue的用法,才知道了堆、仿函数的概念。这篇介绍非常清楚的博文链接:https://blog.csdn.net/weixin_57761086/article/details/126802156 非常清晰地回答了上面我的几个疑问。


这里记录一下我学到的优先队列的概念和性质
    1. 优先队列是一种容器适配器,采用了堆这种数据结构,保证了第一个元素总是整个优先队列中最大的(或最小的)元素。

     2. 优先队列默认使用vector作为底层存储数据的容器,即在vector上使用了堆算法将其中的元素构造成堆的结构。所以优先队列就是堆的一种实现。两者的实质相同,所以也可以说:优先队列是堆的一种别名。