配接器中,改变仿函数的接口者,称为function adapter,改变容器接口者,称为container adapter,改变迭代器接口者,称为iterator adapter

应用于容器,container adapter

即STL提供的两个容器queue和stack,其实都只不过是一种配接器,他们修饰deque的接口而成就出另一种容器风格。

应用于迭代器,iterator adapter

包括insert iterator,reverse iterator,iostream iterator,C++ standard规定他们的接口可以由获得

#include <iterator>

下面来依次介绍他们

insert iterator,可以将一般迭代器的赋值操作转变为插入操作,这样的迭代器包括专司尾端插入操作的back_insert_iterator,专司头端插入操作front_insert_iterator,以及可以从任何位置进行插入的insert_iterator,由于这三个函数太长了,所以STL更提供了三个相应函数,back_inserter(),front_inserter(),inserter()。

copy(ia + 1, ia + 2, std::front_inserter(id));
copy(id.begin(), id.end(), outite);
std::cout << std::endl;
// 输出1 0 1 2 3 4 5

reverse iterator,可以将一般迭代器的行进方向逆转,使原来的operator++变成了后退操作。

copy(id.rbegin(), id.rend(), outite);
std::cout << std::endl;
// 输出5 4 3 2 1 0 1

iostream iterator,将迭代器绑定在某个iostream对象身上,绑定在istream对象身上的,称为istream_iterator,用于输入能力;绑定在ostrem对象身上的,称为ostream_iterator,用于输入能力。这种迭代器用于屏幕输出,非常方便

std::ostream_iterator<int> outite(std::cout, " ");

int ia[] = { 0, 1, 2, 3, 4, 5 };
std::deque<int> id(ia, ia + 6);
copy(id.begin(), id.end(), outite);
// 此时cout << 变成了cout << id[1] << " "
std::cout << std::endl;
// 输出 0 1 2 3 4 5

应用于仿函数

包括系结bind,否定,组合,以及一般函数或成员函数的修饰,在中

not1(bind2nd(less<int>(), 12));

这个式子将less()的第二个参数系结(绑定)为12,再加上否定操作,便形成了不小于12的寓意。

再必须加入我们要做两次函数调用f(g(x)),此时可以这么写

compose1(f(x), g(y));

对参数进行否定:not1,not2(应用于条件判断)
以count_if 条件判断为例

count_if(v.begin(), v.end(), std::not1(std::bind2nd(std::less<int>(), 4)));

对参数进行绑定:bind1st,bind2st(应用于绑定参数)

用于函数合成compose1(两个函数),compose2(三个函数)(应用于参数变化)

用于函数指针:ptr_fun用于成员函数指针:mem_fun,mem_fun_ref(应用于把函数或者成员函数变成STL模式)