作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1520435583.A.218.html
1F:→ loveflames: std::function是通用的函数指标 03/07 23:23
打完突然觉得没甚麽问题了,应该就只是function pointer的宣告而已...
恩似乎也不能删文...
※ 编辑: NaiveRed (134.208.52.240), 03/07/2018 23:37:39
2F:→ PkmX: C++11之後function的type可以写成:auto (args) -> ret 03/08 01:55
3F:→ PkmX: 等价於C的 ret (args) 不过看起来好读很多 03/08 01:55
4F:→ PkmX: 举例:std::function<auto (int, int) -> bool> 03/08 01:56
5F:→ PkmX: 可以更进一步 template<typename T> using ptr = T*; 03/08 02:00
6F:→ PkmX: 这样function pointer可以写成ptr<auto (int) -> bool> 03/08 02:00
哦哦!那看来原本的写法就是宣告function没错了。
※ 编辑: NaiveRed (134.208.52.240), 03/08/2018 09:06:34