C++ STL六大组件-简析
-----------------------------------------------------------------------------------------------
容器适配器
----------------------------------------------------------------------------------------------
适配器是标准库里一个通用的概念。
适配器, 在STL中扮演着转换器的角色,本质上是一种设计模式,用于将一种接口转换成另一种接口,从而是原本不兼容的接口能够很好地一起运作。
容器、迭代器、和函数都有适配器, 适配器不提供迭代器。
根据目标接口的类型,适配器可分为以下几类:
(1) 改变容器的接口,称为容器适配器;
(2)改变迭代器的接口,称为迭代器适配器;
(3)改变仿函数的接口,称为仿函数适配器。
容器的适配器有stack、queue、priority_queue,是在容器deque的基础进行了一些特定的约束,因而本质上并不属于容器,而是容器的适配器。
容器适配器的具体介绍见Container(容器) -容器适配器
函数适配器就是通过将一个操作数绑定到给定值,而将二元函数对象转换为一元函数对象。
函数适配器分为两类:绑定器 与 求反器。
仿函数适配器,相比于其他适配器更加地灵活,可以自由地组合适配。
绑定器:
通过bind,我们将仿函数与参数进行绑定,可实现算法所需的条件判断功能,例如判断小于12的元素时,可使用bind2nd(less(),12),就可以达到目的。
求反器:
否定(negate)这里就是取反的操作,例如not1(bind2nd(less(),12)),就可判断不小于12的元素。
STL提供了很多应用于迭代器的适配器,主要有:有
等等,下面介绍集中主要的迭代器适配器。
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