stl中的ptr_fun的实现
程序员文章站
2022-05-31 21:57:29
...
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);
}