C++基础——STL——priority_queue

优先队列,底层用 堆 来实现,队首元素一定是当前队列中优先级最高的那一个,可以在任何时候往优先队列中加入(push)元素,而优先队列底层的数据结构堆(heap)会随时调整结构,使得每次的队首元素都是优先级最大的

1. 定义

priority_queue<typename> name;

2. 访问

   top() 函数 访问 队首元素(也可以称为堆顶元素),也就是优先级最高的元素

#include <stdio.h>
#include <queue>
using namespace std;
int main(){
	priority_queue<int> q;
	q.push(3);
	q.push(4);
	q.push(1);
	printf("%d\n", q.top());
	return 0;
}

3. 常用函数

(1)push(),q.push(x) 将 x 入队

(2)top(),获得队首元素

(3)pop(),令队首元素出队

#include <stdio.h>
#include <queue>
using namespace std;
int main(){
	priority_queue<int> q;
	q.push(3);
	q.push(4);
	q.push(1);
	printf("%d\n", q.top());
	q.pop();
	printf("%d\n", q.top());
	return 0;
}

(4)empty(),检测优先队列是否为空

#include <stdio.h>
#include <queue>
using namespace std;
int main(){
	priority_queue<int> q;
	if(q.empty() == true)
		printf("Empty\n");
	else
		printf("Not Empty\n");
	q.push(1);
	if(q.empty() == true)
		printf("Empty\n");
	else
		printf("Not Empty\n");
	return 0;
}

(5)size(),返回优先队列内元素的个数

#include <stdio.h>
#include <queue>
using namespace std;
int main(){
	priority_queue<int> q;
	q.push(3);
	q.push(4);
	q.push(1);
	printf("%d\n", q.size());
	return 0;
}

4. priority_queue 内元素优先级的设置

(1)基本数据类型

数字大,优先级高,如果是 char 型,字典序大,优先级高

// 下面两种优先队列定义是等价的:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
// 下面 把最小的元素放在队首
priority_queue<int, vector<int>, greater<int> > q; 
#include <stdio.h>
#include <queue>
using namespace std;
int main(){
	priority_queue<int, vector<int>, greater<int> > q;
	q.push(3);
	q.push(4);
	q.push(1);
	printf("%d\n", q.top());
	return 0;
}

(2)结构体的优先级设置

重载:对已有的运算符进行重新定义,可以改变 小于号 的功能,重载为 大于号 的功能

struct fruit{
    string name;
    int price;
    friend bool operator < (fruit f1,  fruit f2){
        return f1.price < f2.price;
    }
}

重载 大于号 会编译错误,因为从数学上来说只需要重载小于号,即 f1 > f2 等价于判断 f2 < f1, 而 f1 == f2 则等价于判断

猜你喜欢

转载自blog.csdn.net/gsj9086/article/details/86652229