• C++标准库分析总结(九)——<适配器、istream_iterator、ostream_iterator、bind>


    目录

    1 适配器简介

    2 适配器使用分类

    2.1 容器适配器

    2.2 函数适配器

    2.2.1 常见的函数适配器

    2.2.2 bind2nd

    2.2.3 not1

    2.2.4 新型适配器bind

    2.3 迭代器适配器

    2.3.1 reverse_iterator

    2.3.2 insert_iterator

    2.4 X适配器

    2.4.1 ostream_iterator

    2.4.2 istream_iterator





    1 适配器简介

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

    适配器在STL组件的灵活组合运用功能上,扮演着轴承、转换器的角色

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

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

    • 1)改变仿函数接口者,称为函数适配器;对于函数适配器,适配器他也需要获得对应的仿函数一些信息
    • 2)改变容器接口者,称为容器适配器
    • 3)改变迭代器接口者,称为迭代器适配器

    2 适配器使用分类

    适配器分为三类:

    • 迭代器适配器
    • 容器适配器
    • 仿函数适配器

    2.1 容器适配器(queue和stack

    STL提供两个容器适配器:queuestack,它们修饰deque的接口而生成新的容器风貌stack的底层由deque构成

    • stack封锁住了所有的deque对外接口,只开放符合stack原则的几个函数
    • queue的底层也由deque构成。queue封锁住了所有的deque对外接口,只开放符合queue原则的几个函数

     

    2.2 函数适配器

    2.2.1 常见的函数适配器

    在这里插入图片描述

    2.2.2 bind2nd

    从bind2nd这个函数,我们可以看到函数适配器的一些巧妙之处。
    对于模板,我们知道:

    • 1.对于类模板,它必须指明类中元素的类型,而不能由类自己推导
    • 2.对于函数模板,它有能力自己推导传入的参数类型。
    1. vector<int> vec;    //这个int表明我们必须声明类中元素类型
    2. max(1,2);           //即使我们不声明参数1和2的类型,函数max也可以为我们自动推导出他们的类型。

    2.2.3 not1

    std::not1 是用来把符合某种特殊条件的『函数对象』转换为反义「函数对象」的函数。

    2.2.4 bind(新型适配器bind)

    (1)所有bind相关的在c++11都用bind取代了,如图

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

    2.3 迭代器适配器

    2.3.1 reverse_iterator

    • 可以通过一个双向顺序容器调用rbegin(),和rend()来获取相应的逆向迭代器。只要双向顺序容器提供了begin(),end(),它的rbegin()和rend()就如同下面的形式。
    • 单向顺序容器slist不可使用reserve iterators。有些容器如stack、queue、priority_queue并不提供begin(),end(),当然也就没有rbegin()和rend()。

    2.3.2 insert_iterator

    • insert iterators:可以将一般迭代的赋值操作转变为插入操作,可以分为下面几个
    • insert iterators实现的主要观念是:每一个insert iterators内部都维护有一个容器(必须由用户指定);容器当然有自己的迭代器,于是,当客户端对insert iterators做赋值操作时,就在insert iterators中被转为对该容器的迭代器做插入操作(也就是说,调用底层容器的push_front()或push_back()或insert())
    insert iterator作用
    back_insert_iterator专门负责尾端的插入操作
    front_insert_iterator专门负责首部的插入操作
    insert_iterator可以从任意位置执行插入操作

    2.4 X适配器

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

    2.4.1 ostream_iterator

    2.4.2 istream_iterator

    STL函数适配器

    STL函数适配器 - 山上有风景 - 博客园

  • 相关阅读:
    中国石油大学(北京)-《 油层物理》第二阶段在线作业
    SPI通信----基本原理
    Mybatis知识点讲解 【笔记】
    基础复习——共享参数SharedPreferences——记住密码项目——存储卡的文件操作(读写文件&读写图片)...
    Springboot中解析JSON字符串(jackson库ObjectMapper解析JSON字符串)
    JUnit 面试题及答案整理,最新面试题
    使用nvm实现多版本node自由切换
    解决LaTex中插入Visio画图有多余边框的问题
    NTFS文件系统文件寻址实操记录
    WebGL模型视图投影矩阵
  • 原文地址:https://blog.csdn.net/qq_15041569/article/details/128059809