这部分开始适配器的讲解,讲适配器之前还讲了仿函数,但由于比较简单,所以这里简单提一下仿函数。
仿函数就是具有函数特性的class,主要是为算法服务的。STL中有三类仿函数,算术类、逻辑类和相对关系类,下面举几个例子:
//算术类
template <class T>
struct plus : public binary_function<T, T, T> {
T operator()(const T& x, const T& y) const
{ return x + y; }
};
template <class T>
struct minus : public binary_function<T, T, T> {
T operator()(const T& x, const T& y) const
{ return x - y; }
};
//逻辑运算类
template <class T>
struct logical_and : public binary_function<T, T, T> {
T operator()(const T& x, const T& y) const
{ return x && y; }
};
//相对关系类
template <class T>
struct equal_to : public binary_function<T, T, T> {
T operator()(const T& x, const T& y) const
{ return x == y; }
};
template <class T>
struct less : public binary_function<T, T, T> {
T operator()(const T& x, const T& y) const
{ return x < y; }
};
可以看出STL中的仿函数比较特别的就是继承了binary_function,(有的是继承unary_function),这其实就是“融入”STL的条件。我们把类似继承了binary_function的仿函数叫做“可适配的仿函数”,binary_function其实只是赋予了仿函数一堆typedef,当适配一个仿函数的时候,适配器会去“问”仿函数一些问题,只有继承了这些typedef的仿函数能够回答这些问题,后面正式将适配器我们会看到这些例子。
目录
一、容器适配器
之前提到过的stack,queue都是容器适配器,都是内含一个真正“做事”的容器,如下图所示:
二、函数适配器
1. bind2nd
bind2nd就是一种仿函数适配器,功能是将仿函数的第二个参数绑定为特定值,源码如下:
template <class Operation, class T>
inline binder2nd<Operation> bind2nd(const Operation& op, const T& x){
typedef typename Operation::second_argument_type arg2_type;
return binder2nd<Operation>(op, arg2_type(x)); //这里做类型转换是为了对传入参数进行检查
}
template <class Operation>
class binder2nd
: public unary_function<typename Operation::first_argument_type,
typename Operation::result_type>{
protected:
Operation op;
typename Operation::second_argument_type value;
public:
binder2nd(const Operation& x,
const typename Operation::second_argumen