一. 什么是Lambda Ev%_8CO4e
所谓Lambda,简单的说就是快速的小函数生成。 H YA<
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, kK62yz,
Ln&'5D#
G0e]PMeFl
06)B<
class filler q 4Rvr[
{ n:TWZ.9
public : r2t|,%%N7
void operator ()( bool & i) const {i = true ;} )Id.yv}_
} ; Vn7FbaO^
E2hy%y9Tp
*#{V^}
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: \Uz7ar#,
d3,%Z &
s2IjZF {
dq6|m
}g{
for_each(v.begin(), v.end(), _1 = true ); -a^%9 U
pUp&eH
LtJl\m.th
那么下面,就让我们来实现一个lambda库。 bi01]
\ytF@"7
Q/u2Q;j>
0`=>/Wr39
二. 战前分析 &1ZqC;
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 xAZ-_}'tW
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码
_klT
:"ta#g'
47/14rY
2
for_each(v.begin(), v.end(), _1 = 1 ); +VE]
.*T
/* --------------------------------------------- */ {/u}
vector < int *> vp( 10 ); Q;h6F{i
transform(v.begin(), v.end(), vp.begin(), & _1); vV( ?A
/* --------------------------------------------- */ }=7?
&
b
sort(vp.begin(), vp.end(), * _1 > * _2); T_=IH~"
/* --------------------------------------------- */ SJ
ay
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); t_Q\uo}
/* --------------------------------------------- */ G(Ky7SZ
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); !0}SZ
/* --------------------------------------------- */ %U<