C++函数适配器

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

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的元素的个数

2 取反器 将函数对象的结果真值求反
  取反器有两种:not1和not2
  not1是对一元函数对象求反的取反器,传递给函数对象的只有一个参数,则要使用这个not1
  not2是对二元函数对象求反的取反器
  例子
 int* where=find_if(&array[0],&array[100],not1(bind2nd(breater<int>(),200)))

推荐一个很好的判断传参的方法:先写一个类,重载()算符,并接受传递进来的参数,判断后再返回真假
例子:


#include <functional>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cassert>
#define ASSERT assert
using namespace std;
class Rand:public binary_function<int, int, int>
{
public:
Rand()
{ srand((unsigned int)time(NULL)); }
int operator()(int minval, int maxval) const
{
ASSERT(maxval>minval);
ASSERT(minval>=0);
ASSERT(maxval<=RAND_MAX);
return (rand()%(maxval-minval)) + minval;
}
};
int main()
{
cout<<Rand()(1,5)<<endl; //[1,5)
cout<<bind1st(Rand(),20)(30)<<endl;
return 0;
}

C++函数适配器

时间: 2024-12-13 07:41:05

C++函数适配器的相关文章

STL算法设计理念 - 函数适配器

1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象.C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上. 2.取反器(negator) : negator是一个将函数对象的值翻转的函数适配器.标准库提供两个预定义

C++11之function模板和bind函数适配器

在C++98中,可以使用函数指针,调用函数,可以参考之前的一篇文章:类的成员函数指针和mem_fun适配器的用法.   简单的函数调用   对于函数: void foo(const string &s) { cout << s << endl; } 可以使用: void (*pFunc) (const string &) = &foo; pFunc("bar"); 现在,我们使用C++的fumction,这个函数的返回值为void,参数为

C++学习之路: 函数适配器

引言: 函数适配器也是种模板技术, 通过绑定把函数绑定到适配器上实现函数调用, 并且可以修改参数,和移动参数的位置.功能强大 在这里简单介绍一下这种强大的工具 1. 对于普通函数, 直接把它的类型 <返回值 (参数1, 参数2,.......)> 如此填入 适配器当做函数类型即可 function<返回值 (参数1, 参数2,.......)>  pf = &func ; 这样定义, pf就变成了func函数, 可以通过下例一样调用. 1 #include <iost

function/bind 函数适配器

1.function/bind简介 function是一种类模板,重载了operator()函数调用操作符,所以每一个function类的对象都是一个函数对象. bind是一种函数适配器,可以改变参数的个数.顺序. 2.相关代码 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <functional> 5 using namespace std; 6 7 voi

C++ bind函数适配器

在我之前的博客让类成员函数指针成为可调用对象里有提到bind函数适配器,现在在这里介绍一下. 适配器可以让某一个看上去像另一个行为,比如栈.队列等,底层使用链表去完成功能,我们通过操作底层链表去实现栈.队列等的行为.bind是函数适配器,通过bind返回的可调用对象去完成指定函数的功能. bind的头文件是<functional>,可使用命名空间std::placeholders的_n形式引用外部参数,属于C++11标准. 使用例子: // main.cpp #include <func

C++ Primer 学习笔记_53_STL剖析(八):函数适配器:bind2nd 、mem_fun_ref 、函数适配器应用举例

回顾 五.STL中内置的函数对象 一.适配器 1.三种类型的适配器: (1)容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 (2)迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) (3)函数适配器:函数适配器能够将仿函数和另一个仿函数(或某个值.或某个一般函数)结合起来. [1]针对成员函数的函数适配器 [2]针对一般函数的函数适配器 二.函数适配器 1.示例 #include <iostream> #include <algorithm> #i

c++ 提高4 map容器 共性机制 使用时机 比较| STL算法 算法基础仿函数 谓词 函数适配器 遍历算法

[本文谢绝转载] <大纲> STL 容器 map 容器的4中初始化 遍历 map容器 元素的删除观测map.insert返回值,方法123,已存在就报错,初始化方法4会覆盖 map的查找,异常处理 map容器的range返回两个迭代器 multimap案例,按照部门_增删员工信息 容器共性机制 把对象放到容器中,会自动执行拷贝构造函数 各个容器的使用时机 vector与deque的比较: 算法 算法基础 函数对象(仿函数) 函数对象 与普通函数的区别:--  相同之处 函数对象 与普通函数的区

C++STL 预定义函数对象和函数适配器

预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void main() { plus<int> intAdd; int x = 10; int y = 20; int z = intAdd(x, y); //等价于 x + y cout << z << endl; plus<string> stringAdd; str

STL 函数适配器(function adapter)

函数适配器(function adapter):通过不同函数适配器的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能. 绑定(bind) template <class _Operation> class binder1st : public unary_function<typename _Operation::second_argument_type, typename _Operation::result_type> { protected: _Ope