1、 仿函数

仿函数又名函数对象。具有函数性质的对象。就是传入一些參数。然后对參数进行某些运算,然后返回一个值。

为了可以使行为类似函数,须要在类别定义中必须自己定义function call 运算子operator()。

仿函数有例如以下几类:算术类仿函数(plus<T>、minus<T>)关系运算类仿函数(equal_to<T>、less<T>)逻辑运算类仿函数(logical_and<T>、logical_or<T>、logical_not<T>)证同、选择、投射。

1.1、可配接的关键

可配接指的是可以在类原有的基础上扩展成另外一个类。仿函数为此定义了两个类,分别代表一元仿函数和二元仿函数。

之后的不论什么仿函数,依据功能需求选择当中一个类继承。详细代码例如以下:

一元仿函数

template<class Arg, classResult>

struct unary_function

{

typedef Arg argument_type;

typedef Result result_type;

};

template<class T>

struct negate:publicunary_function<T,T>

{

T operator()(const T& x) const {return -x;}

};

二元仿函数

template<class Arg1,classArg2,class Result>

struct binary_function

{

typedef Arg1 first_argument_type;

typedef Arg2 second_argument_type;

typedef Result result_type;

};

template<class T>

struct plus:publicbinary_function<T,T,T>

{

T operator()(const T& x,const T& y) const {return x+y;}

};

2、配接器

配接器类似于转换器,它是一种设计模式,在原有的类型基础上扩展成为另外一个接口,使原本由于接口不兼容而不能合作的类型能够一起工作。

配接器分类例如以下:function adapter(改变仿函数接口)、container adapter(改变容器接口)、iterator adapter(改变迭代器接口)。

2.1     container adapter

最明显的样例就是stack和queue, 直接上代码,一看便知:

template<class T,classSequence=deque<T>>

class stack

{

protected:

Sequence c; //底层容器採用 deque

}

template<class T.classSequence=deque<T>>

class queue

{

protected:

Sequence c;

}

由上可知,class stack和class queue均以deque为底层容器。然后通过封主deque全部对外接口,仅仅开放符合stack或queue原则的几个函数,所以我们称stack和queue是个配接器,一个作用于容器之上的配接器。

2.2     iterator adapter

书中针对迭代器适配器分三类进行描写叙述:insert iterator、 reverseiterator、iostream iterator。后两种在实现技巧和理解上都相对复杂一些。通过实例来分析吧,代码例如以下:

int main()

{

1    ostream_iterator<int> outite(cout," ");

2    int ia[]={0,1,2,3,4,5};

3    deque<int> id(ia,ia+6);

4    copy(id.begin(),id.end(),outite);

5    cout<<endl;  // 0 1 23 4 5

6    copy(ia+1,ia+2,front_inserter(id));

7    copy(id.begin(),id.end(),outite);

8    cout<<endl;  //1 0 12 3 4 5

9    deque<int>::iterator ite=find(id.begin(),id.end(),4);

10  reverse_iterator<deque<int>::iterator>rite(ite)

11   cout<<*ite<<endl; //4

12  cout<<*rite<<endl; //3

}

由上可知。上述第1行代码。採用了iostream iteratoradapter将迭代起绑定到cout对象,组成一个ostream_iterator。拥有输出功能。

第6行代码中front_inserter(id)是个辅助函数,方便client使用insert_iterator。调用该函数后实际产生一个对象迭代器适配器对象:

front_inserter_iterator<container>(x)。第10行代码中,通过reverse iterator迭代器配接器,转换了迭代器的方向,可是须要注意的是迭代器被逆转,尽管实体位置不变。即指针所在的位置不变。可是其所指的实体位置发生的改变,一个指向右,一个指向左。例如以下图所看到的:

2.3     function adapter

该部分是全部配接器中数量最庞大的一个族群。主要是通过对仿函数进行配接操作。组成更加丰富的表达式,简单的样例例如以下:

not1(bind2nd(less<int>(),12))

上式表述的是一个不小于12的表达式,当中less<int>()为仿函数,通过bind2nd这个配接器器辅助函数的操作转换成第二种仿函数。

另外须要补充的是用户函数指针的ptr_fun配接器和用户成员函数指针的mem_fun\men_fun_ref。通过配接器操作可以将一般函数和成员函数当做仿函数使用,并传给STL算法。

 

《STL源代码剖析》学习笔记系列之七、八——仿函数和配接器的更多相关文章

  1. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

  2. Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源代码)

    使用意图筛选器 点击下载源代码 1.创建一个Intents项目,给该项目加入一个新类,命名为MyBrowserActivity.在res/layout目录下新增一个browser.xml: 2.在An ...

  3. Python--网络编程学习笔记系列01 附实战:udp聊天器

    Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑  网络号+主机号(按网络号和主机号占位分类A ...

  4. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  5. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  6. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

  7. 【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图

    [Unity Shaders]学习笔记——SurfaceShader(八)生成立方图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html ...

  8. 步步为营 SharePoint 开发学习笔记系列总结

    转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...

  9. STL源代码剖析 读书总结

    <<STL源代码剖析>> 侯捷著 非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法. 看之前我对于泛型 ...

随机推荐

  1. AC日记——Periodic RMQ Problem codeforces 803G

    G - Periodic RMQ Problem 思路: 题目给一段序列,然后序列复制很多次: 维护序列很多次后的性质: 线段树动态开点: 来,上代码: #include <cstdio> ...

  2. HDU 2191 【多重背包】

    Input 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类, ...

  3. Wannafly挑战赛10 D 小H的询问(线段树)

    题目链接  Problem D 这个题类似 SPOJ GSS3 做过那个题之后其实就可以秒掉这题了. 考虑当前线段树维护的结点 在那道题的基础上,这个题要多维护几个东西,大概就是左端点的奇偶性,右端点 ...

  4. 洛谷——P2660 zzc 种田

    P2660 zzc 种田 题目背景 可能以后 zzc就去种田了. 题目描述 田地是一个巨大的矩形,然而zzc 每次只能种一个正方形,而每种一个正方形时zzc所花的体力值是正方形的周长,种过的田不可以再 ...

  5. [BZOJ 1806] Miners 矿工配餐

    Link: BZOJ 1806 传送门 Solution: 为了使状态包含每个节点前所有必须的信息: 设$dp[i][a1][a2][b1][b2]$为配送到第$i$个,一厂前两个为$a1,a2$,二 ...

  6. MySQL判断中文字符的方法(转)

    准备: 2.1.环境 MySQL mysql> SHOW VARIABLES LIKE "%version%"; +-------------------------+--- ...

  7. 永久关闭WPS热点

    可以通过设置WPS,关闭广告推送和热点即可,方法如下 准备:打开已经安装wps的设备 1.单击电脑左下角,找到wps 2.选中WPS Office中的配置工具 3.在弹窗中选择“高级” 4.打开之后选 ...

  8. 【Hadoop】Hadoop MR Job工作流引擎

    Apache Oozie 是用于 Hadoop 平台的一种工作流调度引擎.该框架(如图 1 所示)使用 Oozie 协调器促进了相互依赖的重复工作之间的协调,您可以使用预定的时间或数据可用性来触发 A ...

  9. Java基础学习过程

    转载:http://blog.csdn.net/scythe666/article/details/51699954JVM 1. 内存模型( 内存分为几部分? 堆溢出.栈溢出原因及实例?线上如何排查? ...

  10. WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)

    转载:    http://www.cnblogs.com/chengtch/p/6105231.html 通过逐个录入的方式,好不容易将需要测试几十个接口的300多个测试用例录入sampler-ht ...