所谓Lambda,简单的说是快速的小函数生成.
在STL的算法中很多地方需要提供一个函数对象或仿函数如for_each
for_each(v.begin(), v.end(), op()); //原格式如此
如果需要不用的算法就需要些不同的函数对象,但是引用了万能的lambda后效果就不同了,效果如下
for_each(v.begin(), v.end(), _1=2); //_1=2是一个仿函数,通过重载=实现
需要的操作一目了然,简单分析下for_each第三个参数需要的是一个函数或仿函数,所以_1=2必然产生的是一个仿函数,大致可以推出是重载了=实现的产生仿函数,那么真正的操作还需要一个封装,即需要两个类实现,第一个类大致如下
struct place_holder
{
//重载需要的算法操作
template <typename R>
op<R> operator=(R i)
{
return op<R>(i);
}
};
模板使得这个结构可以传入任何类型的参数,通过重载=操作内部返回了一个仿函数,具体的操作由一下的仿函数实现
//仿函数,即重载了()操作的类
template <typename T>
struct op
{
op(T i): _i(i) {}
T operator()(T &i)
{
return i = _i;
}
T _i;
};
这个仿函数将传入的引用参数进行了赋值操作,实现了最终的操作.
以上的代码实现=操作如果需要其他操作则重载相应的操作例如+=
依次类推占位类实现+=并通过仿函数可以实现+=的操作以下是完成的代码
// lambda.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
#include <algorithm>
using namespace std;
//仿函数,即重载了()操作的类
template <typename T>
struct op
{
op(T i): _i(i) {}
T operator()(T &i)
{
return i = _i;
}
T _i;
};
template <typename T>
struct op1
{
op1(T i):_i(i){}
T operator()(T &i)
{
return i + _i;
}
T _i;
};
//占位符
struct place_holder
{
//重载需要的算法操作
template <typename R>
op<R> operator=(R i)
{
return op<R>(i);
}
template <typename R>
op1<R> operator+=(R i)
{
return op1<R>(i);
}
};
place_holder _1;
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
//for_each(v.begin(), v.end(), op()); //原格式如此
for_each(v.begin(), v.end(), _1=2); //_1=2是一个仿函数,通过重载=实现
return 0;
}
posted on 2011-03-22 18:30
黑色天使 阅读(164)
评论(0) 编辑 收藏 引用