ptr_fun是一个配接器,这个配接器能够将一般函数当作仿函数使用,使得能够将一般函数当做仿函数传给STL算法。
应用举例
在https://blog.csdn.net/wk_bjut_edu_cn/article/details/80004279这篇文章中是直接运用仿函数的方法,下面是将一般函数当作仿函数来使用
int LESS(int arg1, int arg2) { if (arg1 < arg2) return 1; else return 0; } int main() { vector<int> v{ 1,8,6,9,3 ,10,11 }; //绑定的是第二个参数,所以结果就是<7,即找比7小的元素个数 auto n = count_if(v.begin(), v.end(), bind2nd(ptr_fun(LESS), 7)); //绑定的是第一个参数,所以结果就是7<,即找比7大的元素个数 auto m = count_if(v.begin(), v.end(), bind1st(ptr_fun(LESS), 7)); cout << n << endl; cout << m << endl; system("pause"); return 0; }
下面补充一下函数指针的的概念
函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:int add(int nLeft,int nRight);//函数定义
该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可:
-
int(*p)(int, int);//未初始化
则p可指向int(int,int)类型的函数。p前面有*,说明p是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(int,int)类型的函数。而LESS类型为int(int,int),则p可指向LESS函数。
-
p = LESS;//通过赋值使得函数指针指向某具体函数
以下配接器是把一元函数指针包装
template <class Arg, class Result> class pointer_to_unary_function : public unary_function<Arg, Result> { protected: //ptr是函数指针,相当于int (*ptr)(int),ptr指向的是函数LESS。前面那个int是返回值类型,后面那个是形参 Result(*ptr)(Arg); public: pointer_to_unary_function() {} explicit pointer_to_unary_function(Result(*x)(Arg)) : ptr(x) {}//构造函数,把传进来的函数指针赋值给ptr //ptr(x),这就是通过函数指针执行函数的方式,x是形参类型Arg的一个对象 Result operator()(Arg x) const { return ptr(x); }//一定要理解ptr(x) }; //Arg代表形参类型 //Result是返回值类型 //x是一个函数指针 template <class Arg, class Result> inline pointer_to_unary_function<Arg, Result> ptr_fun(Result(*x)(Arg)) { return pointer_to_unary_function<Arg, Result>(x); }
ptr_fun()是对外接口,真正的实现是pointer_to_unary_function
以下配接器是把二元函数指针包装
原理同上,只不过是一般函数的参数是两个
template <class Arg1, class Arg2, class Result> class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> { protected: Result (*ptr)(Arg1, Arg2); public: pointer_to_binary_function() {} explicit pointer_to_binary_function(Result (*x)(Arg1, Arg2)) : ptr(x) {} Result operator()(Arg1 x, Arg2 y) const { return ptr(x, y); } }; template <class Arg1, class Arg2, class Result> inline pointer_to_binary_function<Arg1, Arg2, Result> ptr_fun(Result (*x)(Arg1, Arg2)) { return pointer_to_binary_function<Arg1, Arg2, Result>(x); }