[C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程

不知不觉C++STL教程系列已经第7期了。之前我们介绍过:vector, queue, stack, set, map等等数据结构。

今天我们来学习一个新的stl容器:priority_queue优先队列。

🎈 作者:Eriktse
🎈 简介:19岁,211计算机在读,现役ACM银牌选手🏆力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)🚀
🎈 个人博客:www.eriktse.com

priority_queue介绍

priority_queue是STL中的一个重要容器,它类似于普通的队列,支持弹出堆顶元素和插入元素的操作,但是有一个很大的不同:队列中元素按照优先级参数排序,最小(或者最大)元素总是在队列的前端,并且会在每次出队的时候被删除。

priority_queue拥有两种不同的方式:一种是按照大顶堆(max heap)方式排序,另一种是按照小顶堆(min heap)方式排序。STL提供了基于容器改编的priority_queue,因此可以在传递给priority_queue的容器中,支持不同类型的元素。

初始化

在使用priority_queue之前需要引入头文件#include <priority_queue>

用以下代码初始化一个空的priority_queue

priority_queue<int> pq;//默认为大根堆

priority_queue<int, vector<int>, greater<int> > pq2;//修改为小根堆

可以用适当类型的对象初始化一个优先级队列:

string wrds[] { "one", "two", "three", "four"};
priority_queue<string> words {start(wrds), end(wrds)}; // "two" "three" "one" "four" 

如果是存放结构体,且要自定义比较函数,可以用仿函数,就是用写一个结构体,然后重载()运算符。

struct Node
{
	int a, b;
};//声明Node结构体

struct cmp
{
	bool operator () (const Node &u, const Node &v)const
	{
		return u.a < v.a;
	}
};

priority_queue<Node, vector<Node>, cmp> pq_Node;

常用操作函数

priority_queue仅维护一个顶部。

插入元素

push()方法:用于将一个新元素添加到堆中。

pq1.push(1);//将元素1插入到pq1中。

获取堆顶元素

top()方法:获取堆顶的元素,但是不会自动弹出,如果需要弹出请再加一个pop()

注意当堆为空时,不允许获取堆顶元素,或弹出堆顶元素,需要判断堆非空才能对堆顶操作。

获取堆内元素个数

size()方法:返回一个非负整数,表示堆内元素个数。

size() == 0时,表示堆为空。

判断堆是否为空

empty()方法:返回一个bool值,表示堆是否为空。

cout << pq.empty() << '\n';//true
pq.push(1);
cout << pq.empty() << '\n';//false

弹出元素

pop()方法:函数用于从堆中弹出当前最大值,并删除该元素。

pq.pop();//将pq中的堆顶元素弹出。

举个例子

#include <iostream>
#include<queue>

using namespace std;

int main()
{
	// 以下是字符常量
	priority_queue <char> pq;
	
	pq.push('C');
	pq.push('Q');
	pq.push('T');
	pq.push('A');

	// 打印队列
	cout << "队列中的元素为:" << endl;
	while (!pq.empty()) 
	{
		cout << pq.top() << " ";
		pq.pop();//弹出
	}
	cout << endl;

	// 整型变量
	priority_queue <int> pq1;

	pq1.push(30);
	pq1.push(100);
	pq1.push(25);
	pq1.push(15);

	// 打印队列
	cout << "队列中的元素为:" << endl;
	while (!pq1.empty()) {
	cout << pq1.top() << " ";
	pq1.pop();
	}
	cout << endl;

	// 浮点常量
	priority_queue <float> pq2;

	pq2.push(2.5);
	pq2.push(1.6);
	pq2.push(103.5);
	pq2.push(17.1);

	// 打印队列
	cout << "队列中的元素为:" << endl;
	while (!pq2.empty()) {
	cout << pq2.top() << " ";
	pq2.pop();
	}
	cout << endl;

	return 0;
}

总结

priority_queue的常用操作方法总结:

1、push()方法:向优先队列中插入元素,插入的元素的优先级由其权值决定。

2、pop()方法:从优先队列中弹出最小的元素,将其从队列中删除。

3、top()方法:获取队列中最小的元素,不会将其从队列中删除。

4、empty()方法:判断队列是否为空,为空返回true,不为空返回false。

5、size()方法:获取队列中元素的个数。

总的来说,priority_queue是一种非常有用的容器,它支持不同类型元素的存储和优先级高低排序,对于简单的任务操作,配合几个函数即可实现,而且还可以自定义比较函数改变默认的排序方式。

posted @ 2023-03-17 22:43  Eriktse0  阅读(28)  评论(0编辑  收藏  举报