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

在阅读使用分支限界法解决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上使用了堆算法将其中的元素构造成堆的结构。所以优先队列就是堆的一种实现。两者的实质相同,所以也可以说:优先队列是堆的一种别名。
   
 3. top() 获得队列中优先级最高的元素;pop() 弹出队列中优先级最高的元素

 

 

优先队列的使用:

  

priority_queue< type, container, function>

Type为数据类型

Container为保存数据的容器

Functioanl为元素比较方式

后两项参数可以省略,默认为vector,比较方式为operator <

  bool operator () (fruit f1,fruit f2){
        return f1.price>f2.price; //相当于小根堆,就是改变<的含义,那就相当于改变优先队列默认模式那就是小根堆
        return f1.price<f2.price; //相当于默认大根堆,就是没改变<的含义,那就相当于是优先队列默认模式那就是大根堆
    }

重写仿函数:

如果没改变<的含义,那就相当于是优先队列默认模式那就是大根堆,如果改变<的含义,那就相当于改变优先队列默认模式那就是小根堆。

posted @   Jocelynn  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示