[問題] compare function object 的相關用法

看板C_and_CPP (C/C++)作者 (天真紅)時間8年前 (2018/03/07 23:13), 8年前編輯推噓0(006)
留言6則, 2人參與, 8年前最新討論串1/1
編譯器: 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

03/07 23:23, 8年前 , 1F
std::function是通用的函數指標
03/07 23:23, 1F
打完突然覺得沒甚麼問題了,應該就只是function pointer的宣告而已... 恩似乎也不能刪文... ※ 編輯: NaiveRed (134.208.52.240), 03/07/2018 23:37:39

03/08 01:55, 8年前 , 2F
C++11之後function的type可以寫成:auto (args) -> ret
03/08 01:55, 2F

03/08 01:55, 8年前 , 3F
等價於C的 ret (args) 不過看起來好讀很多
03/08 01:55, 3F

03/08 01:56, 8年前 , 4F
舉例:std::function<auto (int, int) -> bool>
03/08 01:56, 4F

03/08 02:00, 8年前 , 5F
可以更進一步 template<typename T> using ptr = T*;
03/08 02:00, 5F

03/08 02:00, 8年前 , 6F
這樣function pointer可以寫成ptr<auto (int) -> bool>
03/08 02:00, 6F
哦哦!那看來原本的寫法就是宣告function沒錯了。 ※ 編輯: NaiveRed (134.208.52.240), 03/08/2018 09:06:34
文章代碼(AID): #1Qe05_8O (C_and_CPP)
文章代碼(AID): #1Qe05_8O (C_and_CPP)