【C++】---优先级队列 & 仿函数

优先级队列介绍

优先队列是一种容器适配器 ,它的底层实现是堆,虽然它的名字里面有队列,但它并没有队列先进先出的特性

image-20230404115534258

优先级队列定义在头文件中,其模板参数有三个,第一个是类型,第二个是结构,第三个则是指定底层实现是使用大堆还是小堆(默认是大堆)

关于第三个参数的实现就要提到一个语法知识–仿函数,下面会讲到。先来看看优先级队列的简单接口操作

优先级队列使用

image-20230404122640002

和之前的容器类似,优先级队列也有插入删除接口,这里要注意优先级队列并没有迭代器,因为如果优先级队列具有随机访问的话会破坏底层的堆结构

int main() {
   
	priority_queue<int> qe;
	qe.push(1);
	qe.push(3);
	qe.push(4);
	qe.push(8);
	for (int i = 0; i < 4; ++i) {
   
		cout << qe.top() << " ";
		qe.pop();
	}
	cout << endl;

	return 0;
}

image-20230404123022349

可以看到如果我们定义一个优先级队列并且指定的模板参数只有第一个类型时,其默认的方式是大堆,因此当我们逐个取出数据时,无论插入数据的顺序如何都会在内部自动以大堆的形式排序好。

那么如果我们先要让其以小堆的形式存储呢。首先因为优先级队列的模板参数里面后面的两个参数都给定了缺省值,所以如果我们需要指定第三个参数时注意也要将第二个参数写上

指定大堆或小堆的头文件– 默认是大堆 greater是小堆 less是大堆

int main() {
   
	priority_queue<int, vector<int>, greater<int>> qe;
	qe.push(1);
	qe.push(3);
	qe.push(4);
	qe.push(8);
	for (int i = 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
优先队列(priority_queue)是C++中的一种数据结构,它可以按照元素的优先级进行插入和删除操作。在C++中,优先队列默认使用vector作为底层存储数据的容器,并使用堆算法将vector中的元素构造成堆的结构。优先队列最常用的操作包括push、pop和top。 要遍历优先队列中的元素,可以使用while循环和empty函数来实现。首先,可以使用top函数获取优先队列中的最大(或最小)元素,并将其打印出来。然后,使用pop函数将该元素从优先队列中删除。重复这个过程,直到优先队列为空,即使用empty函数判断优先队列是否为空。在每次循环中,可以将获取的元素打印出来。 下面是一个示例代码来遍历优先队列: ```c++ #include <iostream> #include <queue> using namespace std; int main() { priority_queue<int> pq; pq.push(3); pq.push(8); pq.push(2); pq.push(6); pq.push(9); while (!pq.empty()) { cout << pq.top() << " "; pq.pop(); } cout << endl; return 0; } ``` 以上代码创建了一个优先队列pq,并依次插入了5个元素。然后使用while循环和empty函数遍历优先队列,每次输出堆顶元素,并将其从优先队列中删除,直到优先队列为空。最终输出的结果是按照从大到小的顺序输出了优先队列中的所有元素。 因此,c++优先队列的遍历可以通过循环的方式来实现。在每次循环中,使用top函数获取堆顶元素并打印,然后使用pop函数将其删除。重复这个过程直到优先队列为空。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++算法优先队列、遍历算法、查找算法、排序算法)](https://blog.csdn.net/qq_41915323/article/details/94664541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++——优先级队列](https://blog.csdn.net/qq_55712347/article/details/128874870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值