欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

stl中的ptr_fun的实现

下面补充一下函数指针的的概念

 

  函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:int add(int nLeft,int nRight);//函数定义  

 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可:

  1. int(*p)(int, int);//未初始化

  则p可指向int(int,int)类型的函数。p前面有*,说明p是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(int,int)类型的函数。而LESS类型为int(int,int),则p可指向LESS函数。

  1. 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);
}