1,adapter可以把某些已经存在的东西改造一下,比如把接口改一改,把三个参数的变成两个参数的;把一个函数的名称改一下,adapter通常都是这么使用的。根据adapter改造的东西可以把adapter分为三种,第一种交容器适配器,第二种叫迭代器适配器,第三种叫仿函数适配器。假设a改造B之后,a就代表的B,a就可以供大家使用而不会看到B,但是a所做的事情会交给b去做(两种做法,一种是继承的方法,另一种是a中拥有一个b。STL中都是使用后面一种)。
2,和迭代器的思想差不多,迭代器和其他的部件合作的时候,也是使用问答的方式。仿函数适配器中必须有的三个变量:
typedef A1 first_argument_type; //第一个参数的类型
typedef A2 second_argument_type; //第二个参数的类型
typedef R result_type; //返回值类型
3,queue和stack中都内含一个deque,所以stack和queue属于容器适配器。
4,函数适配器binder2nd:
注意:bind2nd把less修饰了一下,本来是x < y,修饰过后,编程了 x < 40。注意,适配器修饰函数,最后的功能也要是一个函数,所以需要重载()。bind2nd只是把函数准备好,当执行count_if函数时,在pred函数中,传入第一个参数x,执行比较,因为value的值和op在适配器中已经记下来了。
注意: Operation::second_argument_type是Operation利用提问的方式获取第二参数的类型,如果与指定的不对应,就会报错。其他的也是一样的。
注意:binder2nd为什么要继承unary_function呢?这个主要是考虑到如果binder2nd适配后的函数,还要被适配的情况下,就只需要回答两个问题就可以了,因为一个参数已经被固定了,而unary_function就是用来回答两个问题的。
5,新型适配器bind
C++11以后开始提供的,std::bind可以绑定函数,函数对象,成员函数,成员数据。
使用占位符时必须要使用 using namespace std::placeholders,注意占位符的使用。
注意绑定成员函数的时候,member function其实是有一个参数的,就是this。
6.函数适配器not1
这里的原理和binder2nd差不多,不再赘述,源代码见下图:
7.迭代器的适配器inserter
inserter是自己做出一块空间来放数据。
注意:copy函数中的=本来已经写好了,如果对result中对=进行重载后,就会改变=的行为。
8.X适配器ostream_iterator和istream_iterator
这两个适配器很奇妙,本人功力有限没有听懂。