STL源码剖析 - function call操作符讲解(operator())
2015-05-18 15:49
162 查看
function call操作符(operator())
C语言使用函数指针作为参数传入函数
函数指针缺点:它无法持有自己的状态,无法再将某些修饰条件加诸于上而改变状态
为此,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;
}
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;
}
相关文章推荐
- jQuery中$(function()与(function($)等的区别详细讲解
- useful function & operator & custom operator for Row and Array Comparisons
- jQuery中$(function()与(function($)等的区别详细讲解
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
- error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 parameters
- C++ friend template operator overload function
- STL源码剖析:partial ordering of function templates
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
- error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 parameters
- (function($){...})(jQuery) 讲解
- C++ Overloading (Operator and Function)
- js的Function对象的讲解
- jQuery中$(function()与(function($)等的区别详细讲解
- js键盘上下左右键怎么触发function(实例讲解)
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
- Delphi file operator function
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解