一. 什么是Lambda 3%Jg' Tr+
所谓Lambda,简单的说就是快速的小函数生成。 =F2e*?a3
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, g>h5NrDN
jHPJk8@y
e[fzy0
sidSY8j
class filler ar.w'z
{ K'[H`x^
public : Fx']kn9
void operator ()( bool & i) const {i = true ;} ^E&':6(
} ; &(h~{
"R-1G/
PJu)%al
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: yZ t}Jnv
kN9pl^2
K8y/U(@|D
7bioLE
for_each(v.begin(), v.end(), _1 = true ); /[YH
W]
M9{?gM9
b?-Ep?G'\
那么下面,就让我们来实现一个lambda库。 )>q.!"B
7_ g}t!b`
;\=W=wL(
*
";A~XNx
二. 战前分析 M$L1!o1Xf
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 Pb$ep|`u
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 0R~{|RHM
#z{9:o7[-
vKppXm1
for_each(v.begin(), v.end(), _1 = 1 ); 1_uq46
/* --------------------------------------------- */ :.B};;N
vector < int *> vp( 10 ); ]qCAog
transform(v.begin(), v.end(), vp.begin(), & _1); +D|y))fE
/* --------------------------------------------- */ y?W8FL
sort(vp.begin(), vp.end(), * _1 > * _2); d_BO&k