C++ STL六大组件-2-Adapter(适配器)

C++ STL六大组件-简析

-----------------------------------------------------------------------------------------------

  • Container(容器) 
  • Adapter(适配器) 
    • 容器适配器

      • queue
      • priority_queue
      • stack
    • 函数适配器
    • 迭代器适配器
  • Algorithm(算法) 
  • Iterator(迭代器) 
  • Function object(函数对象) 
  • Allocator(分配器)

----------------------------------------------------------------------------------------------

Adapter(适配器) 定义

 适配器是标准库里一个通用的概念。

适配器, 在STL中扮演着转换器的角色,本质上是一种设计模式,用于将一种接口转换成另一种接口,从而是原本不兼容的接口能够很好地一起运作。

容器、迭代器、和函数都有适配器,  适配器不提供迭代器。

适配器类型

根据目标接口的类型,适配器可分为以下几类:

  (1) 改变容器的接口,称为容器适配器;
  (2)改变迭代器的接口,称为迭代器适配器
  (3)改变仿函数的接口,称为仿函数适配器

1. 容器适配器

      容器的适配器有stack、queue、priority_queue,是在容器deque的基础进行了一些特定的约束,因而本质上并不属于容器,而是容器的适配器。

C++ STL六大组件-2-Adapter(适配器)_第1张图片

     容器适配器的具体介绍见Container(容器) -容器适配器

2. 函数适配器

  函数适配器就是通过将一个操作数绑定到给定值,而将二元函数对象转换为一元函数对象。

  函数适配器分为两类:绑定器求反器

  仿函数适配器,相比于其他适配器更加地灵活,可以自由地组合适配。

  绑定器

  通过bind,我们将仿函数与参数进行绑定,可实现算法所需的条件判断功能,例如判断小于12的元素时,可使用bind2nd(less(),12),就可以达到目的。

  求反器

  否定(negate)这里就是取反的操作,例如not1(bind2nd(less(),12)),就可判断不小于12的元素。

3. 迭代器适配器

 STL提供了很多应用于迭代器的适配器,主要有:有

  • back_insert_iterator,
  • front_insert_iterator,
  • insert_iterator,
  • reverse_iterator,
  • istream_iterator,
  • ostream_iterator,
  • istreambuf_iterator,
  • ostreambuf_iterator

等等,下面介绍集中主要的迭代器适配器。

insert iterators

   这种迭代器,可以将迭代器的赋值操作转变为插入操作。根据功能的不同,还分为用于尾端插入的back_insert_iterator,用于头端插入的front_insert_iterator,用于任意位置插入的insert_iterator。

ostream_iterator outline(cout," "); //输出迭代器的适配器

int ia[] = {0,1,2,3,4,5};
deque id(ia,ia+6);
copy(id.begin(),id.end(),outline);//0 1 2 3 4 5
cout<::iterator iter = find(id.begin(),id.end(),5);
copy(ia+0,ia+3,inserter(id,iter));
copy(id.begin(),id.end(),outline);//1 0 1 2 3 4 0 1 2 5 3
cout<

reserve iterators

 这种迭代器,将一般迭代器的行进方向进行逆转,可以很好地应用于从容器尾端开始的算法。

1 copy(id.rbegin(),id.rend(),outline);//3 5 2 1 0 4 3 2 1 0 1
2 cout<

iostream iterators

这种迭代器,将自己绑定一个iostream对象身上,从而获得输入输出的功能。

ostream_iterator outline(cout," ");

int ia[] = {0,1,2,3,4,5};
deque id(ia,ia+6);

copy(id.begin(),id.end(),outline);//0 1 2 3 4 5
cout<

 

 

 

 

 

参考文档:

https://zhuanlan.zhihu.com/p/55675755 

https://www.cnblogs.com/Long-w/p/9830192.html

 

你可能感兴趣的:(c++,STL,c++)