C++ Function object adapter(函数对象适配器)

Function object adapter 会对 Function object 进行修改操作。

常用的adapter(适配器)

1. binder adapter(绑定适配器)

将function object绑定至特定值,能够把二元的function object转化为一元。STL中提供了两个binder adapter分别是bind1st,bind2nd

//binder1st:绑定第一个参数
	/*
		template<class Operation, class Type>
		binder1st <Operation> bind1st(
		   const Operation& _Func,
		   const Type& _Left
		);
	*/
//找到vec中第一个满足10<vec[i]的位置
find_if(vec.begin(),vec.end(),bind1st(less<int>(),10));	
//binder2nd:绑定第二个参数
	/*
		template<class Operation, class Type>
		binder1st <Operation> bind2nd(
		   const Operation& _Func,
		   const Type& _Left
		);
	*/
//找到vec中第一个满足vec[i]<10的位置
find_if(vec.begin(),vec.end(),bind2nd(less<int>(),10));

2. negator adapter(取反适配器)

将function object的真伪值取反。STL中也提供了两个分别是:not1()not2() 分别对应一元,二元function object

/*找出所有大于或等于10的元素,可以将less<int>()的结果取反*/
while((iter=find_if(iter,vec.end(),not1(bind2nd(less<int>(),10))))!=veec.end())

3.insertion adapter(插入适配器)

让我们避免使用容器的assignment运算符。STL提供了三种,分别是back_inserter() , inserter() , front_inserter()
注:这三种adapt包含在头文件iterator内,并且不能用在array上,因为array并不支持插入操作

  1. back_inserter()
    back_inserter会以容器的push_back()函数替代assignment运算符。对vector来说,这个是比较适合inserter。出入back_inserter本身的参数,应该就是容器本身。
vector<int>result_vec;
unique_copy(ivec.begin(),ivec.end(),
			back_inserter(result_vec));
  1. inserter
    inserter()会以容器的insert()函数取代assignment运算符。inserter()接受两个参数:一个是容器,一个是iterator,指向容器内的操作起始点。以vector而言,会这样写:
vector<int>result_vec;
unique_copy(ivec.begin(),ivec.end(),
			inserter(result_vec,result_vec.end()));

  1. front_inserter
    front_inserter()会以容器的push_front()函数取代assignment运算符。这个inserter只适用于list和deque。(使用类似back_inserter())

Q.E.D.