priority_queue的用法

在学习A*算法时用到了prority_queue,在这里简单总结一下C++中priority_queue的用法。

1,数据是基本类型

int main()
{
	priority_queue<int> que;

	for (int i=0; i<10; i++)
	{
		que.push(rand()%100);
	}

	while(!que.empty())
	{
		cout<<que.top()<<endl;
		que.pop();
	}
	return 0;
}
从结果可以看出,这种默认的优先队列是大堆,即最大元素在最前边。但有时我们需要最小的元素在前边。这是我们需要使用priority_queue的另外两个参数了。


priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.

Functional STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆。

int main()
{
	priority_queue<int, vector<int>, greater<int>> que;

	for (int i=0; i<10; i++)
	{
		que.push(rand()%100);
	}

	while(!que.empty())
	{
		cout<<que.top()<<endl;
		que.pop();
	}
	return 0;
}

2,自定义数据类型

对于自定义数据类型,我们需要编写重载函数 operator< 

代码如下:

struct point
{
	int x;
	int y; 
	point(int a=0, int b=0)
	{
		x=a; y=b;
	}
};

bool operator < (point a, point b)
{
	double l = sqrt(a.x*a.x*1.0 + a.y*a.y);
	double r = sqrt(b.x*b.x*1.0 + b.y*b.y);
	return l>r;
}

int main()
{
	priority_queue<point> que;

	for (int i=0; i<10; i++)
	{
		que.push(point(rand()%100, rand()%100));
	}

	while(!que.empty())
	{
		point res = que.top();
		cout<<res.x<<"  "<<res.y<<endl;
		que.pop();
	}
	return 0;
}
上面代码实现的是小堆的情况,如果要最大元素在前只需要在函数:

bool operator < (point a, point b)

把语句

return l>r;
改为

return l<r;


上面的这些只是优先队列的最基本使用方法。

STL的优先队列没有查找功能,所以自己实现了一个版本

http://blog.csdn.net/mjlsuccess/article/details/37900599





你可能感兴趣的:(数据结构,优先队列)