看板 C_and_CPP 關於我們 聯絡資訊
編譯器: 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