C++STL 体系结构与内核分析(侯捷)——课程笔记(十三)

这部分开始适配器的讲解,讲适配器之前还讲了仿函数,但由于比较简单,所以这里简单提一下仿函数。

仿函数就是具有函数特性的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的仿函数能够回答这些问题,后面正式将适配器我们会看到这些例子。

 

 

目录

一、容器适配器

二、函数适配器

三、迭代器适配器

四、ostream和istream的适配器


一、容器适配器

之前提到过的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值