您的位置:首页 > 运维架构

STL源码剖析 - function call操作符讲解(operator())

2015-05-18 15:49 162 查看
function call操作符(operator())

C语言使用函数指针作为参数传入函数

#include<cstdlib>
#include<iostream>
using namespace std;

int fcmp(const void *elem1 , const void *elem2)
{
const int *i1 = (const int*)elem1;
const int *i2 = (const int*)elem2;
if(*i1 < *i2)
return -1;
else
if(*i1 == *i2)
return 0;
else
return 1;
}

int main()
{
int ia[6] = {5,4,3,2,1,0};
qsort(ia , sizeof(ia) / sizeof(int) , sizeof(int) , fcmp);//排序后由小到大
for(int i = 0 ; i < 6 ; i++)
cout<<ia[i]<<' ';
cout<<endl;
}


函数指针缺点:它无法持有自己的状态,无法再将某些修饰条件加诸于上而改变状态

为此,STL接受所谓的“条件”或“策略”或“一整租操作”,都将以仿函数形式呈现
如果针对某个class进行operator()重载,它就成为一个仿函数。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//定义两个仿函数
template<class T>
class MyPlus
{
public:
T operator()(const T& x , const T& y) const
{
return x + y;
}
};
template<class T>
struct MyMinus
{
T operator()(const T& x , const T& y) const
{
return x - y;
}
};

int main()
{
MyPlus<int> plusobj;
MyMinus<int> minusobj;
cout<<plusobj(3,5)<<endl;//使用仿函数就像使用一般函数一样
cout<<minusobj(3,5)<<endl;

cout<<MyPlus<int>()(43,50)<<endl;//MyPlus<int>()后面加上()会产生一个临时对象,可不必提前声明对象
cout<<MyMinus<int>()(43,50)<<endl;
}

仿函数应用:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
template<class T>
struct MyGreater
{
bool operator()(const T& x , const T& y) const
{
return x > y ? true : false;
}
};

template<class T>
struct MyPrint
{
void operator()(const T& elem) const
{
cout<<elem<<" ";
}
};

int main()
{
int ia[6] = {0,1,2,3,4,5};
vector<int> iv(ia , ia + 6);
for_each(iv.begin() , iv.end() , MyPrint<int>());//使用仿函数打印
cout<<endl;
sort(iv.begin() , iv.end() , MyGreater<int>());//使用自定义的仿函数排序
for_each(iv.begin() , iv.end() , MyPrint<int>());
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐