STL仿函数

《STL源码剖析》中用单独的一张讲解来仿函数,仿函数主要应用在算法的实现里,用来实现一个算法的多种功能,比如sort函数,通过仿函数机制使得用户可以自定义排序规则。

关于仿函数的讲解可以参考《STL源码剖析》一书,博客:https://blog.csdn.net/yzhang6_10/article/details/51297424也对书中内容做来一些总结笔记,下面贴上一段代码帮助理解:

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

bool comp2(const int &a,const int &b)  //当该函数指针作为sort的参数传入时,该函数只能是全局函数或者静态成员函数,类里的非静态成员函数会报错

{

    return a>b;

}


struct compare {   //struct compare:public binary_function<int,int,bool>{ //STL中需要如此继承,为了用户可以去用仿函数的参数类型,这里不做分析,可参考《STL源码剖析》

    bool operator()(const int& x,const int& y)const{

        return x<y;

    }

};

/*STL中一个标准仿函数

 template<class T>

 struct greater:public binary_function<T,T,bool>{

 bool operator()(const T& x,const T& y) const{

 return x>y;

 }

 */

int main()

{

    vector<int>vec;

    vec.push_back(33);

    vec.push_back(237);

    vec.push_back(93);

    vec.push_back(186);

    vec.push_back(32);

    compare comp1;

    sort(vec.begin(),vec.end(),comp1);  //传入一个仿函数对象

    /*

     至于传入comp1这个对象会怎么被用起来,大家可以想象,在sort排序函数内部,会用到comp1()的返回值,比如举个例子(STL sort源码不见得如此):

     int max=comp1(x1,x2)?x1:x2; 然后将max应用到排序里,这样来实现按照我们给的规则排序

     */

    for(int i=0;i<vec.size();i++)

    {

        cout<<vec[i]<<" ";

    }

    cout<<endl;

    sort(vec.begin(),vec.end(),comp2); //传入函数指针

    for(int i=0;i<vec.size();i++)

    {

        cout<<vec[i]<<" ";

    }

    cout<<endl;

    sort(vec.begin(),vec.end(),compare());  //传入一个临时仿函数对象

    for(int i=0;i<vec.size();i++)

    {

        cout<<vec[i]<<" ";

    }

    cout<<endl;

    //system("pause");

    return 0;

}

有问题的地方或是不清楚的地方大家可以留言交流~

猜你喜欢

转载自blog.csdn.net/weixin_39138071/article/details/79745807
今日推荐