一. 什么是Lambda gd3~R+Kd
所谓Lambda,简单的说就是快速的小函数生成。 ek6PMZF:'
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, qv|geBW
D h y
\5.36Se
!IlsKMZ
class filler tEP~`$9
{ <}x_F)E[t
public : Kc~h
void operator ()( bool & i) const {i = true ;} Ru8k2d$B
} ; 4A(kM}uRB
W]cJP
9A0wiKp
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: kd^CZ;O
W9>q1
./nq*4=
1j7^2Y|UT`
for_each(v.begin(), v.end(), _1 = true ); g/Q hI
YSi[s*.G
2uw1R;zw
那么下面,就让我们来实现一个lambda库。 rMkoE7n
&wc%mQV
\d~sU,L;]
9AQMB1D*v4
二. 战前分析 K^0cL%dB
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 4E[ 9)n+YV
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 tHgn-Dhzr
$|~YXH~O
\[</|]'[
for_each(v.begin(), v.end(), _1 = 1 ); S !Dq8
/* --------------------------------------------- */ (3kz(6S
vector < int *> vp( 10 ); 6^
UQ{P1;
transform(v.begin(), v.end(), vp.begin(), & _1); ~"-+BG(5
/* --------------------------------------------- */ U1zcJl^
sort(vp.begin(), vp.end(), * _1 > * _2); O3,IR1
/* --------------------------------------------- */ 20glz(
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); [|{2&830
/* --------------------------------------------- */ (6##\}L&