《STL源代码剖析》学习笔记系列之七、八——仿函数和配接器
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源代码剖析》学习笔记系列之七、八——仿函数和配接器的更多相关文章
- python学习笔记系列----(八)python常用的标准库
		
终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...
 - Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源代码)
		
使用意图筛选器 点击下载源代码 1.创建一个Intents项目,给该项目加入一个新类,命名为MyBrowserActivity.在res/layout目录下新增一个browser.xml: 2.在An ...
 - Python--网络编程学习笔记系列01 附实战:udp聊天器
		
Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑 网络号+主机号(按网络号和主机号占位分类A ...
 - 《STL源代码剖析》---stl_deque.h阅读笔记(2)
		
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
 - .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
		
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
 - Dynamic CRM 2013学习笔记 系列汇总
		
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
 - 【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图
		
[Unity Shaders]学习笔记——SurfaceShader(八)生成立方图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html ...
 - 步步为营 SharePoint 开发学习笔记系列总结
		
转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...
 - STL源代码剖析 读书总结
		
<<STL源代码剖析>> 侯捷著 非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法. 看之前我对于泛型 ...
 
随机推荐
- kuangbin系列【简单搜索】
			
poj-1321棋盘问题[bfs/回溯] Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36385 Accepted: ...
 - js   timestamp 转换 date   和     将秒数整理为时分秒格式
			
// 获得的后台json 时间格式转化 例如:1520305366000 转化为XXXX-XX-XX类似这种 function timeStamp2String(time){ var datetim ...
 - manacher(马拉车)算法详解+例题一道【bzoj3790】【神奇项链】
			
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=39091399 (CSDN好像有bug,不知道为什 ...
 - 透视投影(Perspective Projection)变换推导
			
透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为.在算法中它是通过透 ...
 - 【OpenJudge7624】【区间DP】山区建小学
			
山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...
 - 虚拟机拷贝之后,发现系统内的开机自启动的nginx,不能自启动了
			
因业务需要,同事以某个虚拟机为模板,复制出其他的CentOS虚拟机时,发现原系统内的开机自启动的nginx,不能再自启动了. 好吧,那就重新注册一下 nginx 的开机自启动: # 先删除原来的注册: ...
 - 待签名参数按照字段名的ascii码从小到大排序
			
public static String getSign(Map<String, String> params) { Map<String, String> sortMap = ...
 - java 中的VO,PO,DTO,DO对象
			
经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应 ...
 - iOS:UICollectionView纯自定义的布局:瀑布流布局
			
创建瀑布流有三种方式: 第一种方式:在一个ScrollView里面放入三个单元格高度一样的tableView,禁止tableView滚动,只需让tableView随着ScrollView滚动即可. ...
 - 静态代码检查工具-PMD刚開始学习的人入门篇
			
前言: PMD是一款静态代码分析工具.它能够自己主动检測各种潜在缺陷以及不安全或未优化的代码. PMD很多其它地是集中在预先检測缺陷上.它提供了高度可配置的丰富规则集,用户能够方便配置对待特定项目使用 ...