目录
1. 仿函数的概念
仿函数是一个类或结构体,它通过重载()来简化操作。
以下是一个仿函数Less(库中是less)以及调用演示的代码
template<class T>
class Less
{
public:
bool operator()(const T& a, const T& b)
{
return a < b;
}
};
int main()
{
vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
Less<int> lessfunc;
cout << lessfunc(1, 4) << endl;
}
有less来判断小于,也有判断大于的greater,用法与less相同。
2. 仿函数的使用场景
这里主要说明less和greater两个仿函数的使用
2.1 排序
在排序函数sort中使用
在sort排序中,less和greater作为排序算法的参数使得排序可以改变升序和降序
sort函数中默认是less,也就是升序,当我们在第三个参数添加了greater<int>时,就会变成降序排序
vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
sort(v.begin(), v.end());
for (auto ch : v)
{
cout << ch << " ";
}
cout << endl;
2.2 优先级队列(priority_queue)
在优先级队列中加入仿函数可以实现优先级队列的大堆和小堆
下面是一段对于优先级队列的模拟实现的一部分代码,主要截取了向下建堆的使用,将建堆中相同类型的比较都用仿函数来实现,这样当我们想要改变大堆或小堆时不用一个一个地改变每个大于号或小于号了,只需改变第三个模板参数即可。
注意:这里使用less是大堆,greater是小堆。
template <class T, class Container = vector<T>, class Compare = less<T> >
class priority_queue
{
//向下建堆
void AdjustDown(int parend)
{
int child = parend * 2 + 1;
while (child<c.size())
{
if (child+1<c.size() && comp(c[child], c[child + 1]))
{
child = child + 1;
}
if (comp(c[parend],c[child] ))
{
swap(c[parend], c[child]);
parend = child;
child = parend * 2 + 1;
}
else
{
break;
}
}
}
private:
Compare comp;
}
3. 总结
这里主要解释的是less和greater这两个仿函数的使用,其他仿函数会在后续使用熟练后补上。