C++ 函数适配器
1、考虑下面的需求,在一个int的vector中,找出一个比5的元素,容易想到的解决办法,定义一个方法对象,使用模板,如下:
vector<int>::iterator iter = find_if(intVec.begin(),intVec.end(),Finder<int>(3));
2、分析
find_if的伪代码如下:
for (; _First != _Last; ++_First)
{
if (_Pred(*_First))
{
return _First;
}
}
return _Last;
也就是说,第三个参数只要能够执行 _Pred(*_First) 就可以,也就是具备隐式接口_Pred(*_First)。
方法对象Finder<int>(3) 满足条件。
3、有没有其他的办法呢?
我们已经有了方法对象greater 用于比较两个对象的大小,以及参照物,能不能使用greater呢?
这里存在问题:greater接收两个参数比较大小,而find_if的第三个参数具备隐式接口_Pred(*_First),只接受一个参数。
这就需要解决,greater接受两个参数,把其中一个参数(参照物)固定下来,转化为只接受一个参数的方法。这就是方法适配器。
也就是说,对greater和已知的参照物提供一层封装,对外只接受一个参数,对内转交给greater,来比较变量和参照物的大小。
4、代码如下:
vector<int>::iterator iter = find_if(intVec.begin(),intVec.end(),bind2nd(greater<int>(),3));
greater<int>() 是匿名的方法对象,bind2nd(greater<int>(),3) 对匿名的方法对象和参照物进行封装,产生一个新的方法对象,对外接受一个参数,对内转交给greater,比较参数和参照物的大小。
5、注意:适配器模式与代理模式的区别,适配器模式是客户要求接口A,已存在的组件可以完成功能,但是没有接口A,提供适配器对组件封装,对外暴露接口A,对内转交给组件处理。对组件封装,有两种方式:private继承(实现继承)和关联。private继承叫做类适配器,关联叫做对象适配器模式。而代理模式是proxy和subject具备同样的接口,proxy关联subject,做的事情都转交给subject。
C++ 函数适配器的更多相关文章
- function adapter(函数适配器)和迭代器适配器
所谓function adapter(函数适配器)是指能够将不同的函数对象(或是和某值或某寻常函数)结合起来的东西,它自身也是个函数对象. 迭代器适配器 运用STL中的迭代器适配器,可以使得算法能够 ...
- STL算法设计理念 - 函数适配器
1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...
- C++STL 预定义函数对象和函数适配器
预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void ...
- 函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
一.适配器 三种类型的适配器: 容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) 函数适配器:函数适配器能够将仿函数 ...
- C++11之function模板和bind函数适配器
在C++98中,可以使用函数指针,调用函数,可以参考之前的一篇文章:类的成员函数指针和mem_fun适配器的用法. 简单的函数调用 对于函数: void foo(const string &a ...
- STL函数适配器
一:适配器简介 C++中有三类适配器,分别是容器适配器,迭代器适配器和函数适配器,这里主要介绍函数适配器. (一)函数适配器简介 STL中已经定义了大量的函数对象,但是有时候需要对函数返回值进行进一步 ...
- STL 函数适配器(function adapter)
函数适配器(function adapter):通过不同函数适配器的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能. 绑定(bind) template <class ...
- C++之函数适配器--绑定器bind原理图解
转自:http://www.cnblogs.com/xusd-null/p/3698969.html#3081606 本文解释了bind 是如何工作的.为了清晰,图中的语法作了一些简化(例如,省略函数 ...
- 类的成员函数指针和mem_fun适配器的用法
先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: v ...
随机推荐
- [Winform]Media Player组件全屏播放的设置
摘要 在设置程序开始运行时,让视频全屏播放时,直接设置 windowsMediaPlay.fullScreen = true; 会报错,代码如下 windowsMediaPlay.URL = _vid ...
- EF6+Sqlite连接字符串的动态设置
摘要 在winform中应用sqlite和ef,对于sqlite连接字串的设置,大多情况下是不想写死了,你不知道用户会将你的exe程序安装在什么位置,也不知道他的电脑盘符是什么,如果写死了,那么很有可 ...
- SNK 与PFX
snk 1用来证明这个生成的程序集是你发布的: 2如果你写的程序集要用在多个应用程序上的话,那么这个程序集必须要拥有唯一的名称,这个强名称是程序集唯一名称的一部分. 3只要你保护好你的snk文件不要公 ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 在ASP.NET MVC中实现Select多选
我们知道,在ASP.NET MVC中实现多选Select的话,使用Html.ListBoxFor或Html.ListBox方法就可以.在实际应用中,到底该如何设计View Model, 控制器如何接收 ...
- IOS开发之——objective-c与javascript交互
原文:http://blog.csdn.net/pjk1129/article/details/6936545 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要 ...
- ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)
点显示进度条后→ android:max="100" 进度条的最大值 android:progress 进度条已经完成的进度值 android:progressDrawab ...
- HTML5 本地文件操作之FileSystemAPI实例(一)
文件操作实例整理一 1.请求系统配额类型 console.info(window.TEMPORARY); //0 临时 console.info(window.PERSISTENT); //1 持久 ...
- LaTeX技巧24:LaTeX常用命令集锦
\hyphenation{word list} %断字命令:\showthe\topmargin %显示某个参数的数值或者内容: 在tex编译过程中出现行溢出(overflow hbox)是由于断字程 ...
- 【转】你真的懂select Socket模型吗?
转自:http://www.cppblog.com/xvsdf100/archive/2013/12/10/204689.html 只要接触过c/c++网路编程人都可能会知道select io ...