C++ priority_queue為例的比較函式
很多時候,我們需要過載諸如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中對()的過載。
具體原因不清楚,若有知情者,希望能指點指點鄙人
相關文章
- 【C/C++】計時函式比較C++函式
- C與C++在函式和資料的比較C++函式
- C++程式中不同函式呼叫方式的彙編碼比較C++函式
- 幾個分析函式的比較函式
- Python的內建比較函式cmp比較原理剖析Python函式
- Oracle 中 replace函式和translate函式比較Oracle函式
- Mysql 一個比較好用的函式MySql函式
- MySQL:MySQL層比較函式呼叫MySql函式
- [C++] 自定義C++比較器比較大小C++
- C++ priority_queueC++
- JavaScript - 函式 setTimeout 和 setInterval 的比較JavaScript函式
- C語言的比較庫函式--qsortC語言函式
- 拷貝建構函式(比較全的)函式
- JavaScript 匿名函式與具名函式執行效率比較JavaScript函式
- js命名函式與匿名函式執行速度比較JS函式
- js匿名函式和具名函式執行效率比較JS函式
- C++類將函式模板宣告為友元 例項C++函式
- cmp是可選的自定義比較函式函式
- linux下execl函式的使用和比較Linux函式
- 使用頻率比較高的PHP函式方法PHP函式
- 比較重要的例題
- C++ 中三種正規表示式比較C++
- c/c++ 標準庫 set 自定義關鍵字型別與比較函式C++型別函式
- php版本比較函式version_compare()PHP函式
- Python有哪些比較重要的內建函式?Python函式
- 物件導向與函式程式設計的比較物件函式程式設計
- 關於時間跨度比較的OVERLAPS函式函式
- stl中各種容器的自定義比較函式函式
- Oracle Decode()函式和CASE語句的比較Oracle函式
- Go 與 C++ 的對比和比較GoC++
- js函式作為函式的引數程式碼例項JS函式
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式
- DB2常用函式與Oracle比較TIDB2函式Oracle
- python基礎 split 和 join函式比較Python函式
- 【C++ STL】queue和priority_queueC++
- Guava鏈式風格Ordering比較器例項Guava
- 【SQL】使用分析函式與關聯子查詢的比較SQL函式
- C++的函式式革命C++函式