zoukankan      html  css  js  c++  java
  • 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

    作者:灼光
    本博客文章大多为原创,转载请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    poj 2112
    写给学大计python的同学的查错方法
    [Win32 API学习] Edit,ListBox的用法,字体的设置
    [Win32 API] FindFirstFile()和FindNextFile()
    初探C++ win32 api——Hello world!
    [学习笔记]舞蹈链(DLX)(C++指针版)
    2020科大回归记
    SCOI2019AFO记
    [学习笔记]动态动态规划/动态DP/DDP
    BZOJ5343[CTSC2018]混合果汁(二分答案+主席树)
  • 原文地址:https://www.cnblogs.com/laiyingpeng/p/11274895.html
Copyright © 2011-2022 走看看