函数适配器

来源:互联网 发布:看国外电视台的软件 编辑:程序博客网 时间:2024/05/16 01:02

先弄清几个概念,什么叫一元函数,二元函数

1. 一元函数一个参数
2. 
二元函数 两个参数
3. 一元谓词 一个参数,返回类型为bool型
4. 二元谓词 两个参数,返回类型为bool型

函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征。因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候就需要函数适配器来为我们的函数进行适配

 

C++中有三类适配器,分别是容器适配器,迭代器适配器和函数适配器,这里主要介绍函数适配器。
函数适配器用于特化和扩展一元二元函数对象,函数适配器主要有以下两类:
1 绑定器

该类适配器用于将二元函数适配成一元函数

 将二元函数的一个参数绑定到一个特定的值上,将二元函数对象转换成一元函数对象。
  绑定器适配器有两种:bind1st bind2nd。每个绑定器接受一个函数对象和一个值
  bind1st将给定值绑定到二元函数对象的第一个实参
  bind2nd将给定值绑定到二元函数对象的第二个实参
  例子:

先看下count_if的普通用法

count_if:  利用输入的函数,对标志范围内的元素进行比较操作,返回结果为true的个数。例如:vecInt是用vector<int>声明的容器,已包含1,3,5,7,9元素,现要求求出大于等于3的元素个数

bool GreaterThree(int iNum){if(iNum>=3){return true;}else{return false;}}int iCount = count_if(vecIntA.begin(),vecIntA.end(), GreaterThree);//这里要求GreaterThree的函数参数必须是一个//此时iCount == 4 count_if(vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10)); // less_equal<int>()函数是两个参数,怎样让他变成一个参数呢?less_equal是STL为我们提供的一个函数对象,它有两个参数,其作用是比较第一个参数值是否<=第二个参数值。但是count_if要求我们第三个参数必须是一个一元谓词(就是只有一个参数),所以我们用bind2nd对该函数对象进行适配,将10绑定到该函数对象的第二个参数上。(意思就是说less_equal<int>( _Left, _Right)这个函数只要他的第二个参数,第一个参数忽略)现在cont_if执行的功能实际上就变成了查找给定序列中值<=10的元素的个数

标准库提供了一组函数适配器(function adapter),用于特化和扩展一元和二元函数对象。函数适配器分为如下两类:

(1)绑定器(binder),是一种函数适配器,它通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。

(2)求反器(negator),是一种函数适配器,它将谓词函数对象的真值求反。

  标准库定义了两个绑定器适配器:bind1st和bind2nd。每个绑定器接受一个函数对象和一个值。正如你可能想到的,bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。例如,为了计算一个容器中所有小于或等于10的元素的个数,可以这样给count_if传递值:

   count_if(vec.begin(),vec.end(),

            bind2nd(less_equal<int>(),10));

  传给count_if的第三个实参使用bind2nd函数适配器,该适配器返回一个函数对象,该对象用10做右操作数应用<=操作符。这个调用计算输入范围中小于或等于10的元素的个数。

  标准库还定义了两个求反器:not1和not2。你可能已经想到,not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。

count_if(vec.begin(),vec.end(),not1(bind2nd(less_equal<int>(),10)));


0 0
原创粉丝点击