C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>

一、仿函数定义

  仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用。仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,且无法和STL其他组件搭配,仿函数就是使一个类的使用看上去像一个函数,其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了,本质就是类重载了一个operator(),创建一个行为类似函数的对象。

  对于重载了()操作符的类,可以实现类似函数调用的过程,所以叫做仿函数,实际上仿函数对象仅仅占用1字节,因为内部没有数据成员,仅仅是一个重载的方法而已。实际上可以通过传递函数指针实现类似的功能,但是为了和STL内部配合使用,他提供了仿函数的特性。

1.1 标准库对仿函数的实现分类

  标准库目前提供了约有24个仿函数

1.2 仿函数使用

下图中myclass是我们自己写的仿函数,但是由于没有继承仿函数的公共父类,所以就不能融入到STL中

1.3 仿函数可适配的条件

  如果我们要自己写仿函数,并且融入到STL中, 就必须继承两个中的一个父类(两个操作符或者一个操作符的父类),只有继承了才能被适配器去修饰和改造

二、Adapters(适配器)

2.1 适配器定义

  把一个原本存在的东西,改成我们需要的另一种东西(把类中的函数名称改一下,接口改一改(三个参数变两个参数)),比如stack就是deque的适配器,反向迭代器也是从迭代器上改造过来的,比如a是b的适配器,对于外部来说当然我们就用a就好了,b对于我们来说就是隐藏的,但是a它只起中间桥梁作用,活还是交给b来做(b是已经存在的好东西)。

  适配器得实现方式有两种:继承和内含,STL普遍使用内含的方式。

  适配器分为三类:迭代器适配器,容器适配器,仿函数适配器。

2.2 适配器使用分类

2.2.1 容器适配器

 

2.2.2 函数适配器

2.2.1.1 bind用法

  所有bind相关的在c++11都用bind取代了

   bind可以绑定函数、函数对象、成员函数、数据成员

2.2.3 迭代器适配器

  用于改造迭代器的适配器,改造完后也是一个迭代器

  reverse_iterator叫做逆向迭代器

  inserter是改造原有的insert,会先创造这个空间然后再赋值

 三、istream_iterator、ostream_iterator

  前面总结的适配器有三大类(函数适配器,容器适配器,迭代器适配器),istream_iterator、ostream_iterator均不属于前面提到的三大类别,所以称为X适配器。

3.1 ostream_iterator

 3.2 istream_iterator

posted @ 2019-08-01 16:24  灼光  阅读(292)  评论(0编辑  收藏  举报
document.body.oncopy=function(){ event.returnValue=false; var t=document.selection.createRange().text; var curUrl = window.location.href; var s="本文来源于灼光的博客(https://www.cnblogs.com/laiyingpeng/) , 原文地址:" + curUrl + "转载请加上原文地址。"; clipboardData.setData('Text','\r\n'+t+'\r\n'+s+'\r\n\r\n\r\n'); }