仿函数(又称函数对象)其实就是一个类重载了()
,使得这个类的使用看上去像一个函数。
仿函数就是假函数,它是把对象当作函数使用,所以也称为函数对象。因为普通函数在某些特殊场景下使用比较麻烦,所以就诞生了仿函数
举个栗子:
我们来写一个判断小于的仿函数,怎么做呢?
定义一个类,重载一下()就行了,函数体的实现根据我们的需求去写:
那我们来用一下这个仿函数:
1小于2为真,所以打印结果为1。
那如果我们只看这一行:
这是不是就像是一个函数调用啊。
当然它本质是去调用了类里面的operator()
。
那要告诉大家的是仿函数它的作用和价值还是很大的,不过我们现在还不能很好的体会到。
C++其实本质搞出这个东西是因为函数指针太复杂了,而仿函数在很多场景能达到一个替代函数指针的作用。
就比如我们这里优先级队列控制这个大堆小堆,我们之前实现过堆,我们知道控制大堆小堆其实就是就是控制里面元素的比较方式不同。
那我们C语言解决这样的问题是不是就是去传一个函数指针嘛,就比如C语言里面那个qsort函数:
它是不是就是通过传递一个函数指针来控制元素的比较方式啊。
而C++的sort就可以传仿函数去控制:
当然不是只能传仿函数,我们看到它给的是一个模板。
那我们上面用到的greater包括默认给的less其实就是库里面提供的仿函数。
当然我们看到它可以写成这样greater<int>
,那库里面的其实是实现成模板了。
而我们刚才这样写的是只针对整型,如果像比较任意类型我们就可以将他实现成模板: