您的位置:首页 > 产品设计 > UI/UE

priority_queue优先队列容器

2015-04-24 14:50 411 查看
priority_queue优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列里的元素进行了由大到小的顺序排序.元素的比较规则默认按元素的值由大到小排序,当然,可以重载"<"操作符来从新定义比较规则.

案例1:

重载"<"操作符来定义优先级

如果优先队列的元素类型是结构体,可以通过在结构体中重载"<"操作符的方法来修改优先队列的优先性.

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

//定义结构体
struct Info {
	string name;
	float score;
	//重载"<"操作符,指定优先规则(排序规则)
	bool operator < (const Info &a) const {
		//按score由从小到大排列.如果要由大到小排列,使用">"号即可
		return a.score < score;
	}
};

int main()
{
	//定义优先队列,元素类型为Info结构体
	priority_queue<Info> pq;
	//定义结构体变量
	Info info;
	info.name = "Jack";
	info.score = 68.5;
	pq.push(info);
	
	info.name = "Bomi";
	info.score = 18.5;
	pq.push(info);
	
	info.name = "Peti";
	info.score = 90;
	pq.push(info);
	
	//元素全部出队
	while(pq.empty() != true) {
		//返回队首元素
		cout << pq.top().name << " : " << pq.top().score << endl;
		//出队,删除队首元素
		pq.pop();
	}
	return 0;
}

案例二:

重载"()"操作符来定义优先级

如果优先队列的元素不是结构体类型,则可以通过重载"()"操作符的方式来定义优先级.当然,元素是结构体类型,也可以通过重载"()"操作符来定义优先级,而不是一定要在结构体内重载"<"操作符才行.

代码:

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

struct myComp {
	bool operator()(const int &a, const int &b) {
		//由小到大排列采用">"号,如果要由大到小排列,则采用"<"号
		return a > b;
	}
};

int main()
{
	//定义优先队列,元素类型为int型,显示说明内部结构式vector
	priority_queue<int, vector<int>, myComp> pq;
	//入队
	pq.push(1);
	pq.push(9);
	pq.push(2);
	pq.push(30);
	//元素全部出队
	while(pq.empty() != true) {
		//返回队首元素
		cout << pq.top() << " ";
		//出队,删除队首元素
		pq.pop();
	}
	cout << endl;
	return 0;
}


案列3:

像int,float,double,char这样的类型可以用更简单的代码来实现由小到大的排列.

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

int main()
{
	//定义优先队列,元素类型为int型,显示说明内部结构式vector
	priority_queue<int, vector<int>, greater<int> > pq;
	//入队
	pq.push(1);
	pq.push(9);
	pq.push(2);
	pq.push(30);
	//元素全部出队
	while(pq.empty() != true) {
		//返回队首元素
		cout << pq.top() << " ";
		//出队,删除队首元素
		pq.pop();
	}
	cout << endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: