码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 优先队列priority_queue问题

时间:2020-03-12 18:46:50      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:形式   优先队列   全局   highlight   push   turn   注意   操作   函数   

优先队列是建立在队列的基础上来进行求解的;

仍然具有相同的函数操作,但是唯一不同的是增加了一个新的特性:根据自定义可以对队列内输出顺序进行控制;

 

情况一:当如果使用普通数值来说:

简单的定义方式:

priority_queue<int>q;

这种是最简单的不定义控制方式的操作,默认将队列内的元素从大到小进行排列,出队先出最大的;

 

如果项进行大小输出的控制:

priority_queue<int,vector<int>,greater<int> >q;

第一个指明数据类型,第二个可以不用管,当成一个队列维护标志,且不用引入vector头文件;

第三个参数是指队列内的分布类型,有两种可选形式:

1.greater<int>

2.less<int>

可以把这两个看成分布形式,例如greater表明数据元素是递增进行排列的,所以出队肯定是最小的元素;

 

情况二:如果是自定义结构类型;

类似于sort函数中的cmp定义。

总的来说有两种定义方式:

1.通过定义伪函数来进行,即定义cmp来代替greater<int>的位置:

struct cmp {
	bool operator() (node a, node b) {
		if (flag == 1)
			return a.x < b.x;
		else
			return a.y < b.y;
	}
};  

需要在外部单独的定义要给cmp结构体,重载的是()双目运算符;

值得注意的是,重载运算符和sort()中的cmp一样,可以通过全局变量来进行控制,并且其中一样,都是代表数据的分布形式;

 

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

struct node {
	int x;
	int y;
};

int flag = 0;

struct cmp {
	bool operator() (node a, node b) {
		if (flag == 1)
			return a.x < b.x;
		else
			return a.y < b.y;
	}
};


int main() {
	for (int k = 0; k < 2; k++) {
		int n = 100;
		priority_queue<node,vector<node>,cmp>pq;
		for (int i = 1; i < n; i *= 2) {
			node no;
			no.x = i;
			no.y = 100 - i;
			pq.push(no);
		}
		while (!pq.empty()) {
			cout << pq.top().x << endl;
			pq.pop();
		}
		flag++;
	}
}

 如上所示;

 

2.通过重载struct中的<单目运算符:

struct node {
	int x;
	int y;
	bool operator < (const node& a) const{
		if (flag == 0)
			return x < a.x;
		else
			return y < a.y;
	}
};

这里注意一下,关于<重载的问题。

首先,<是一个单目运算符,运算的时候实际排列为a,this node;

所以x是自己里面的元素,而对于第一条判定则是要求,a,this node的关系符合a.x>this node的关系,也就是降序关系;

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

int flag = 0;
struct node {
	int x;
	int y;
	bool operator < (const node& a) const{
		if (flag == 0)
			return x < a.x;
		else
			return y < a.y;
	}
};


int main() {
	for (int k = 0; k < 2; k++) {
		int n = 100;
		priority_queue<node>pq;
		for (int i = 1; i < n; i *= 2) {
			node no;
			no.x = i;
			no.y = 100 - i;
			pq.push(no);
		}
		while (!pq.empty()) {
			cout << pq.top().x << endl;
			pq.pop();
		}
		flag++;
	}
}

  

个人觉得还是重载伪函数()比较好理解,这个还是能不用尽量别用;

 

C++ 优先队列priority_queue问题

标签:形式   优先队列   全局   highlight   push   turn   注意   操作   函数   

原文地址:https://www.cnblogs.com/songlinxuan/p/12471420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!