STL之函数适配器

STL之函数适配器

1.理论知识



2.常用函数适配器

标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是:

1绑定器(binder):

binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象。C++标准库提供两种预定义的binder适配器:bind1stbind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上。

2取反器(negator) :

negator是一个将函数对象的值翻转的函数适配器。标准库提供两个预定义的ngeator适配器:not1翻转预定义一元函数对象的真值,而not2翻转二元谓词函数的真值。

常用函数适配器列表如下

bind1st(op, value)
bind2nd(op, value)
not1(op)
not2(op)
mem_fun_ref(op)
mem_fun(op)
ptr_fun(op)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.典型案例

class IsGreat
{
public:
    IsGreat(int i)
    {
        m_num = i;
    }
    bool operator()(int &num)
    {
        if (num > m_num)
        {
            return true;
        }
        return false;
    }
protected:
private:
    int m_num;
};

void main43()
{
    vector<int>  v1;
    for (int i=0; i<5; i++)
    {
        v1.push_back(i+1);
    }

    for (vector<int>::iterator it = v1.begin(); it!=v1.end(); it ++)
    {
        cout << *it << " " ;
    }

    int num1 = count(v1.begin(), v1.end(), 3);
    cout << "num1:" << num1 << endl;

    //通过谓词求大于2的个数
    int num2 = count_if(v1.begin(), v1.end(), IsGreat(2)); 
    cout << "num2:" << num2 << endl;

    //通过预定义函数对象求大于2的个数   greater<int>() 有2个参数 
    //                                              param > 2
    int num3 = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 2 ) );
    cout << "num3:" << num3 << endl;

    //取模 能被2整除的数 求奇数
    int num4 = count_if(v1.begin(), v1.end(), bind2nd(modulus <int>(), 2 ) ); 
    cout << "奇数num4:" << num4 << endl;

    int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus <int>(), 2 ) ) ); 
    cout << "偶数num5:" << num5 << endl;
    return ;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

4.预定义函数对象和适配器案例代码


#include <iostream>
using namespace std;

#include "string"
#include <vector>
#include <list>
#include "set"
#include <algorithm>
#include "functional"


//plus<int> 预定义好的函数对象 能实现不同类型的数据的 + 运算
//实现了 数据类型 和算法的分离 ===》通过函数对象技术实现的。。。。

//思考:怎么样知道 plus<type> 是两个参数
void main21()
{
    /*
    template<class _Ty>
    struct plus
        : public binary_function<_Ty, _Ty, _Ty>
    {   // functor for operator+
        _Ty operator()(const _Ty& _Left, const _Ty& _Right) const
        {   // apply operator+ to operands
            return (_Left + _Right);
        }
    };
    */
    plus<int> intAdd;
    int x = 10; 
    int y = 20;
    int z = intAdd(x, y); // x + y 
    cout << "z:" << z << endl;

    plus<string> stringAdd;

    string s1 = "aaa";
    string s2 = "bbb";
    string s3 = stringAdd(s1, s2);
    cout << "s3:" << s3 << endl;

    vector<string> v1;
    v1.push_back("bbb");
    v1.push_back("aaa");
    v1.push_back("ccc");
    v1.push_back("zzz");
    v1.push_back("ccc");
    v1.push_back("ccc");

    /*
    template<class _Ty>
    struct greater
        : public binary_function<_Ty, _Ty, bool>
    {   // functor for operator>
        bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {   // apply operator> to operands
            return (_Left > _Right);
        }
    };
    */
    sort(v1.begin(), v1.end(), greater<string>() );

    for (vector<string>::iterator it=v1.begin(); it!=v1.end(); it++)
    {
        cout << *it << endl;
    }

    //求 ccc 出现的个数
    string sc = "ccc";

    //equal_to<string>() 有两个参数 left参数来自容器,right参数来自sc
    //bind2nd函数适配器 :把预定义函数对象 和 第二个参数进行绑定
    int num = count_if(v1.begin(), v1.end(), bind2nd(equal_to<string>(), sc) );
    cout << "num: " << num << endl;
}

class IsGreat
{
public:
    IsGreat(int i)
    {
        m_num = i;
    }
    bool operator()(int &num)
    {
        if (num > m_num)
        {
            return true;
        }
        return false;
    }
private:
    int m_num;
};

void main22()
{
    vector<int> v1;
    for (int i=0; i<10; i++)
    {
        v1.push_back(i+1);
    }
    for (vector<int>::iterator it=v1.begin(); it!=v1.end(); it++ )
    {
        cout << *it << " ";
    }
    cout << endl;

    int num1 = count(v1.begin(), v1.end(), 3);
    cout << "num1:" << num1 <<endl;

    //通过 谓词 求大于2 的个数
    int num2 = count_if(v1.begin(), v1.end(),  IsGreat(2));
    cout << "num2:" << num2 <<endl;

    /*
    template<class _Ty>
    struct greater
        : public binary_function<_Ty, _Ty, bool>
    {   // functor for operator>
        bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {   // apply operator> to operands
            return (_Left > _Right);
        }
    };
    */
    //通过 预定义的函数对象 求大于2 的个数
    //greater<int>() 有两个参数 左参数来自容器的元素 ,右参数固定成2 (通过bind2nd做的)
    int num3 = count_if(v1.begin(), v1.end(), bind2nd (greater<int>(), 2) );
    cout << "num3:" << num3 <<endl;

    //求 奇数的个数
    int num4 = count_if(v1.begin(), v1.end(), bind2nd (modulus<int>(), 2) );
    cout << "奇数的个数num4:" << num4 <<endl;

    //求 偶数的个数 取反器(negator) 
    int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd (modulus<int>(), 2) ) );
    cout << "偶数的个数 num5:" << num5 <<endl;

}
void main2222()
{
    //main21();
    main22(); //函数适配器综合案例
    cout<<"hello..."<<endl;
    system("pause");
    return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值