《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;
}
有问题的地方或是不清楚的地方大家可以留言交流~