STL 自定义比较函数

    以priority_queue为例。

    如果我要写一个元素类型为整型的大根堆,那么直接用STL的优先队列就可以了。

#include 
#include 
using namespace std;

priority_queue  Q;

int main()
{
	Q.push(1);
	printf("%d\n",Q.top());
	Q.pop();
	return 0;
}

    但有些时候我们需要使用小根堆,直接使用STL还是可以实现的。

#include 
#include 
#include 
#include 
using namespace std;

priority_queue ,greater > Q;

int main()
{
	Q.push(1);
	Q.push(2);
	printf("%d\n",Q.top());
	Q.pop();
	return 0;
}


    输出是1,符合小根堆。简单地理解一下,greater是int的比较函数,这个位置原本放的应该是“小于”的比较函数,但是这时我放了一个“大于”的比较函数上去,比较函数恰好反了过来,那么原来大根堆就变成小根堆了。

    如果要自定义元素类型?

#include 
#include 
using namespace std;

struct Node
{
	int x,y;
	Node(int _x=0,int _y=0):x(_x),y(_y){}
	bool operator< (const Node &b) const {return x Q;

int main()
{
	Q.push(Node(1,1));
	Q.push(Node(2,2));
	printf("%d %d\n",Q.top().x,Q.top().y);
	Q.pop();
	return 0;
}

    输出是2 2。即重载<运算符,就相当于自定义了一个“小于”比较函数。这个是当做大根堆用的,如果要小根堆,把xb.x和y>b.y就好了。

    如果需要同时维护两个堆,一个大根堆,一个小根堆,而且元素类型相同?

    自定义less、greater比较函数。

#include 
#include 
#include 
using namespace std;

struct Node {int x,y;Node(int _x=0,int _y=0):x(_x),y(_y){}};

struct Less
{
	bool operator()(const Node &a,const Node &b)const {return a.xb.x || (a.x==b.x && a.y>b.y);}
};

priority_queue ,Less   > Q1;
priority_queue ,Greater> Q2;

int main()
{
	Q1.push(Node(1,1));
	Q1.push(Node(2,2));
	printf("%d %d\n",Q1.top().x,Q1.top().y);
	
	Q2.push(Node(1,1));
	Q2.push(Node(2,2));
	printf("%d %d\n",Q2.top().x,Q2.top().y);
	return 0;
}

    输出第一行2 2,第二行1 1。

你可能感兴趣的:(STL)