优先队列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; //相当于默认大根堆,就是没改变<的含义,那就相当于是优先队列默认模式那就是大根堆 }
重写仿函数:
如果没改变<的含义,那就相当于是优先队列默认模式那就是大根堆,如果改变<的含义,那就相当于改变优先队列默认模式那就是小根堆。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~