priority_queue优先队列实现堆

~ 2025-12-26 12:50:07

序言

在实现一些算法的时候,会用到大大顶堆和小顶堆,下面介绍在C++中用优先队列实现堆。

首先,优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。 定义: priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 。 一般的使用方式:

/升序队列 
priority_queue <int,vector<int>,greater<int> > q; 
//降序队列 
priority_queue <int,vector<int>,less<int> >q; 
/*greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。
其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)*/

1. 使用基本类型的例子

#include<iostream> 
#include <functional>
#include <queue> 
#include <string>
using namespace std;
int main()
{
	//对于基础类型 默认是大顶堆 
	priority_queue<int> a;
	//等同于 
	//priority_queue<int, vector<int>, less<int>> a; //这里一定要有空格,不然成了右移运算
	priority_queue<int, vector<int>, greater<int> > c; //这样就是小顶堆 
	priority_queue<string> b;
	for (int i = 0; i < 5; i++)
	{
		a.push(i);
		c.push(i);
	}
	while (!a.empty())
	{
		cout << a.top() << ' ';
		a.pop();
	}
	cout << endl;
	while (!c.empty()) {
		cout << c.top() << ' ';
		c.pop();
	}
	cout << endl;
	b.push("abc");
	b.push("abcd");
	b.push("cbd");
	while (!b.empty())
	{
		cout << b.top() << ' ';
		b.pop();
	}
	cout << endl;
	return 0;
}

输出

4 3 2 1 0
0 1 2 3 4
cbd abcd abc

2.pari的比较

先比较第一个元素,第一个相等比较第二个。顺便学习pair的使用方式。

#include <iostream> 
#include <queue> 
#include <vector> 
using namespace std; 
int main() 
{ 
	priority_queue<pair<int, int> > a; 
	pair<int, int> b(1, 2); 
	pair<int, int> c(1, 3); 
	pair<int, int> d(2, 5); 
	a.push(d); 
	a.push(c); 
	a.push(b); 
	while (!a.empty()) 
	{ 
		cout << a.top().first << ' ' << a.top().second << '\n'; 
		a.pop(); 
	}
}

3. 使用自定义的类型

#include <iostream>
#include <queue> 
using namespace std;

//方法1 
struct tmp1 //运算符重载< 
{
	int x;
	tmp1(int a) { x = a; }
	bool operator<(const tmp1& a) const {
		return x < a.x; //大顶堆 
	}
};
//方法2 
struct tmp2 //重写仿函数 
{
	bool operator() (tmp1 a, tmp1 b)
	{
		return a.x < b.x; //大顶堆 
	}
};
int main()
{
	tmp1 a(1);
	tmp1 b(2);
	tmp1 c(3);
	priority_queue<tmp1> d;
	d.push(b);
	d.push(c);
	d.push(a);
	while (!d.empty()) {
		cout << d.top().x << '\n';
		d.pop();
	}
	cout << endl;
	priority_queue<tmp1, vector<tmp1>, tmp2> f;
	f.push(c);
	f.push(b);
	f.push(a);
	while (!f.empty()) {
		cout << f.top().x << '\n';
		f.pop();
	}
}

输出

3
2
1

3
2
1

转载自C++中两种实现堆的方式:make_heap和priority_queue



我们会审查剪贴板内容,并对发布不合适内容的同学进行相应的处理