指定仿函数

1.作为模板类型实参的仿函数

      传递仿函数的一个方法是让它的类型作为一个模板实参,传递一个该类型的仿函数对象。

类型本身并不是一个仿函数,因此客户端或者客户端类都必须创建一个给定类型的仿函数对象。当前,只有class类型仿函数才能这么做,函数指针不行,而且函数指针本身也不会指定任何行为

eg: template<typename FO>---->模板类型实参

      void my_sort(...)

{

     FO cmp;//创建函数对象

     if(cmp(x,y)){

         。。。

    }

}

//以仿函数为模板实参,来调用函数

my_sort(std::less<...> >(...);---》模板显式实例化传递模板实参

          比较代码(std::less)的选择将会在编译器进行,并且由于比较操作是内联的,所以一个优化的编译器将能够产生本质上等价于不使用仿函数,而直接编写的代码

2.作为函数调用实参的仿函数

     另一种传递仿函数的方法是以函数调用实参的形式进行传递----》传递仿函数对象

eg:

 template<typename  F>

void my_sort(...,F cmp)--->函数调用实参

{

     if(cmp(x,y)){

          .....

      }

}

//以仿函数作为调用实参,调用排序函数

my_sort(...,std::less<...>());---->函数调用实参:传递对象,进行实参演绎


3.结合函数调用实参和模板类型实参

             对于前面两种传递仿函数的方式---》即传递函数指针和class类型的仿函数,只需要定义缺省函数调用实参,是完全可以把这两种方式结合起来

 eg:

 template<typename F>

void my_sort(..., F cmp=F())

{

if(cmp(x,y){


}

}


4.作为非类型模板实参的仿函数---》函数指针作为非类型模板实参

            class类型的仿函数将不能作为一个有效的非类型模板实参,我们可以让一个指向class类型对象的指针或引用作为非类型实参

注意: 在C++中,借助于引用或者指针的非类型实参必须能够和参数类型精确匹配,从派生类到基类的转型是不允许的,而进行显式类型转换也会使实参无效

总结: class类型的仿函数适合做类型模板实参进行传递,而函数指针(函数引用)却可以是有效的非类型实参
















优先队列是一种数据结构,它可以按照一定的优先级顺序对元素进行排序和访问。在 C++ 中,我们可以使用优先队列容器来实现这个功能。 优先队列容器是通过堆的数据结构实现的,所以在使用优先队列时,我们需要指定元素的比较方式。在 C++ 中,我们可以通过仿函数function object)来定义比较规则。 仿函数是一种类对象,它可以像函数一样被调用。在优先队列中,我们需要定义一个仿函数来确定元素的优先级顺序。这个仿函数需要重载函数调用运算符 `operator()`,并根据自定义的比较规则来判断两个元素的优先级。 以下是一个示例代码,展示了如何使用仿函数来定义优先队列的比较规则: ```cpp #include <iostream> #include <queue> class MyCompare { public: bool operator()(int a, int b) { // 自定义比较规则,这里使用逆序 return a > b; } }; int main() { std::priority_queue<int, std::vector<int>, MyCompare> pq; pq.push(3); pq.push(1); pq.push(5); while (!pq.empty()) { std::cout << pq.top() << " "; pq.pop(); } return 0; } ``` 在上面的示例中,我们定义了一个名为 `MyCompare` 的仿函数类,重载了 `operator()` 运算符,使用逆序的方式来比较元素的优先级。然后,我们在创建优先队列时将 `MyCompare` 作为第三个参数传递进去,告诉优先队列使用这个仿函数来确定元素的优先级顺序。 当我们按照逆序的方式插入元素后,从优先队列中取出的元素会按照升序的方式输出。 希望这个示例可以帮助你理解如何使用仿函数来定义优先队列的比较规则。如有疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值