作者NaiveRed (天真紅)
看板C_and_CPP
標題[問題] compare function object 的相關用法
時間Wed Mar 7 23:12:59 2018
編譯器:
Mingw-w64
用 C++11 下去編
問題(Question):
標題可能下的不太好...
先講問題,看到幾個 priority_queue 在指定自己的比較方法時的寫法:
1. 這邊的 compare 只是 function
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)>
PQ(compare)
不太理解
bool (*)(Node, Node) 這個的寫法是什麼,有甚麼名稱嗎?
也可以直接用 lambda expression
priority_queue<node, vector<node>, bool (*)(const node &, const node &)>
PQ([](const node &a, const node &b) -> bool {
return a.v > b.v;
});
---
以下順便討論幾個常用(?)的作法:
第一種
平常解題在寫自定義的比較時
通常是直接去 overload < 然後用預設的 std::less 去比較。
struct node
{
//...
bool operator<(const node &a) const
{
return value > a.value;
}
};
第二種
則是寫成 class 後去 overload ()
//in class Compare
public:
bool operator() (node, node)
{
//return ...;
}
std::priority_queue<node, std::vector<node>, Compare> PQ;
第三種
利用 std::function,不過這個我幾乎沒用過,
並沒有很了解...
大致上的理解是把它當作 wrapper 可以拿來存
function object, function, lambda expression 之類的東西。
//compare 只是 function
std::priority_queue<node, std::vector<node>, std::function<bool(node, node)>>
PQ(compare);
感覺跟問題的有點像,我的想法是宣告的第三個欄位
是要放拿來比較用的 class type,
所以其實 std::function<bool(node, node)> 會是一個type嗎?!
--
有錯還煩請指正,謝謝!
有時想拿解題來練習一些 C++ 平常比較少用的語法和特性(當然是指我少用的),
就會發現自己似乎從沒好好學過 C++ ...
-
以上參考:
http://en.cppreference.com/w/cpp/container/priority_queue
https://goo.gl/tPvED4
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 134.208.52.240
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1520435583.A.218.html
→ loveflames: std::function是通用的函數指標 03/07 23:23
打完突然覺得沒甚麼問題了,應該就只是function pointer的宣告而已...
恩似乎也不能刪文...
※ 編輯: NaiveRed (134.208.52.240), 03/07/2018 23:37:39
→ PkmX: C++11之後function的type可以寫成:auto (args) -> ret 03/08 01:55
→ PkmX: 等價於C的 ret (args) 不過看起來好讀很多 03/08 01:55
→ PkmX: 舉例:std::function<auto (int, int) -> bool> 03/08 01:56
→ PkmX: 可以更進一步 template<typename T> using ptr = T*; 03/08 02:00
→ PkmX: 這樣function pointer可以寫成ptr<auto (int) -> bool> 03/08 02:00
哦哦!那看來原本的寫法就是宣告function沒錯了。
※ 編輯: NaiveRed (134.208.52.240), 03/08/2018 09:06:34