stl中的ptr_fun的实现

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),要想声明一个指向该类函数的指针,只需用指针替换函数名即可

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





猜你喜欢

转载自blog.csdn.net/wk_bjut_edu_cn/article/details/80008002
今日推荐