STL之配接器

xiaoxiao2021-02-28  97

adapter:将一个class的接口转换为另一个class的接口。

应用于仿函数,functor adapters,价值在于通过它们直接的绑定,组合,修饰能力,几乎可以无限制地创造出各种可能的表达式。

配接操作包括系结(bind),否定(negate),组合(compose)、以及对一般函数或成员函数的修饰。

例如:不小于12 可以使用greater_equal的仿函数;

            也可以使用not1(bind2nd(less<int>(),12)),即将less<int>()第二个参数系结为12,再加上否定操作。

举例如何设计仿函数自己的配接器:

template<class Operation1,class Operation2> class unary_compose  : public unary_function<typename Operation2::argument_type,typename Operation1::result_type>//typename不是不能放到基类列中吗? { protected: Operation1 op1; Operation2 op2; public: unary_compose(const Operation1& x,const Operation2& y) :op1(x),op2(y){} //嵌套从属名称 typename Operation1::result_type  operator()(const typename Operation2::argument_type& x) const{ return op1(op2(x)); } }; template<class Operation1,class Operation2> inline unary_compose<Operation1,Operation2> compose1(const Operation1& op1,const Operation2& op2) { return unary_compose<Operation1,Operation2>(op1,op2); }

//为什么这个函数在新建的.h文件中就编译不过,报错是语法错误,但是放到xfunctional就可以使用?

函数如何采用配接能力:一元仿函数必须继承unary_function,二元仿函数必须继承自binary_function,成员函数必须以mem_fun处理过,一般函数必须以ptr_fun处理过。

迭代器的配接器:insert iterators,reverse iterators,iostream iterators. insert iterators: 能够将迭代器的赋值操作转变为插入操作。包括专司尾端的插入操作,专司头端的插入操作,以及可以从任意位置执行插入操作 reverse iterators:方便用在从尾端开始运行的算法上。 iostream iterators:可以将迭代器绑定到某个iostream对象上 迭代器配接器的目的:就是方便算法上加入自己的应用策略。 举例: int ia[] = {0,1,2,3,4,5} deque<int> id(ia,ia+6) copy(ia+1,ia +2,front_inserter(id));  //输出的是1,0,1,2,3,4,5 cout<<endl;
转载请注明原文地址: https://www.6miu.com/read-84395.html

最新回复(0)