C++ priority_queue為例的比較函式

fancy_male發表於2020-12-02

很多時候,我們需要過載諸如priority_queue中的比較函式。在這其中有一些小細節,如下:

1、經典錯誤及解決方案

1.1錯誤寫法

struct node
{
public:
	node()
	{
		a = 1;
	}
	bool operator < (node b)
	{
		return a < b.a;
	}
	int a;
};

這樣的比較函式在priority_queue容器中是無法通過的。
如圖,轉載自某某同學:
在這裡插入圖片描述
可以看到,裡面用了const修飾。(MSVC的實現)

1.2正確示例

1.2.1示例一

struct node
{
public:
	node()
	{
		a = 1;
	}
	bool operator < (const node& b) const
	//dev中可以寫bool operator < (node b) const
	{
		return a < b.a;
	}
	int a;
};

1.2.2示例二

struct cmp
{
	bool operator ()(node a , node b){
		return a.a < b.a;
	}
};

呼叫的時候,如下:

	priority_queue<node, vector<node>, cmp> q;

2、細節部分

如果兩者同時存在,即既有在內部實現<的過載。又在外部實現 struct cmp中()的過載,並且在呼叫的時候兩者一起呼叫,示例如下:

#include<bits/stdc++.h>
using namespace std;

struct node
{
public:
	node(int n)
	{
		a = n;
	}
	bool operator < ( node b) const
	{
		return a > b.a;
	}
	int a;
};

struct cmp
{
	bool operator ()(node a , node b){
		return a.a < b.a;
	}
};
int main()
{
	priority_queue<node, vector<node>, cmp> q;
	q.emplace(3);
	q.emplace(1);
	node p = q.top();
	q.pop();
	cout<<p.a<<endl;
	return 0;
}

執行結果:
在這裡插入圖片描述
這裡,我們需要注意的是:priority_queue是從隊尾彈出元素。也就是如果過載函式是要求從小到大排序,那麼就會彈出最大的那個元素。
結論:在這裡,我們的結論為:實際上priority_queue採用的是struct cmp中對()的過載。
具體原因不清楚,若有知情者,希望能指點指點鄙人

相關文章