栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STL源码剖析 第八章 配接器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STL源码剖析 第八章 配接器

  • 设计模式:将一个类的接口转化为另外一个类的接口
配接器的概观和分类
  • 改变仿函数接口  函数配接器  ;queue和stack 通过修饰deque函数接口来实现
  • 改变容器接口      容器配接器  ; insert、reverse、iostream 等iterators他们的接口可以由iterator获得
insert iterator
  • 将一般迭代器的赋值操作转变为插入操作
  • 例子:尾部插入 back_insert_iterator ; 头部插入 front_insert_iterator ;任意位置 insert_insert_iterator
  • 对应的函数封装

Reverse Iterators
  •  将迭代器的行进方向进行逆转,使得operator++变成 后退操作;operator--变成前进操作
  • 主要目的是为了 从尾端进行前进的算法上
Iostream Iterators
  • 将迭代器绑定到某一个 iostream对象身上
  • 例子:绑定到istream(std::cin) 称为 istream_iterator,拥有输入功能
  • 例子:绑定到istream(std::cout) 称为 ostream_iterator,拥有输出功能,用于屏幕输出
  • 改变迭代器接口   迭代器配接器
#include 
#include 
#include 
#include 

int main(){
    //将outite绑定到cout
    //每次对 outite 指派一个元素,随后接一个" "
    std::ostream_iteratoroutite(std::cout," ");
    int ia[] = {0,1,2,3,4,5};
    std::dequeid(ia,ia+6);
    //将所有的元素拷贝到outite(也就是拷贝到cout)
    std::copy(id.begin(),id.end(),outite); //0 1 2 3 4 5
    std::cout << 'n';

    //将ia[] 的部分元素拷贝到id内,使用front_insert_iterator
    //注意:front_insert_iterator会将assign 操作改为push_front操作
    //因为vector不支持push_front()
    std::copy(ia+1,ia+2, std::front_inserter(id));
    std::copy(id.begin(),id.end(),outite);
    std::cout << 'n';

    std::copy(ia+3,ia+4, std::back_inserter(id));
    std::copy(id.begin(),id.end(),outite);
    std::cout << 'n';
    
    //搜寻元素5所在的位置
    std::deque::iterator ite = std::find(id.begin(),id.end(),5);
    std::copy(ia+0,ia+3, std::inserter(id,ite));
    std::copy(id.begin(),id.end(),outite);
    std::cout << 'n';

    //将所有元素逆向拷贝
    //使用rbegin() 和 rend() 关联到revere_iterator
    std::copy(id.rbegin(),id.rend(),outite);
    std::cout << 'n';
}

应用于仿函数
  •  配节操作:系结(bind)、否定 、组合、对一般成员或者成员函数的修饰

 

  • 注意事项:期望获得配接能力的组件,本身必须是可以配接的,即一元仿函数需要继承unary_function、二元仿函数需要继承binary_function、成员函数必须以mem_fun处理过、一般函数需要以ptr_fun处理过
  • 一个未经ptr_fun处理过的一般函数,虽然可以使用,但是没有任何的配接的 能力

 容器适配器
  • stack
  • stack封装了所有deque的对外接口,只有符合规则的函数才会被开放,因此stack是作用于容器上的配接器

  • queue
 Iterator adapters insert iterators
  • 内部维护一个容器,容器有自己的迭代器,因此客户端对insert iterators赋值操作,在insert iterators中转换成对这个容器的迭代器进行插入操作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

请使用手机"扫一扫"x
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号