一. 什么是Lambda QC5f:BwM
所谓Lambda,简单的说就是快速的小函数生成。 (<R\
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, NU&^7[!yl
x$?7)F&z
LF)a"Sh
\P~rg~
class filler hf+/kc!>i
{ _O)2
public : Ms'TC;&PS
void operator ()( bool & i) const {i = true ;} )
~)SCN>-
} ; j)tCr Py
^Ii \vk
5 (21gW9
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: 4 ^~zN"6]
-8Jl4F ,
*- IlF]
#"p1Qea$
for_each(v.begin(), v.end(), _1 = true ); 5Jhbf2-
?+,*YVT
r5!x,{E6
那么下面,就让我们来实现一个lambda库。 ^o6)[_L
SXo[[ao
OT}Yr9h4
O`[iz/7m
二. 战前分析 yEpN,A
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 8LQ59K_WX
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 ?F87C[o
Y =g>r]2
Ih-3t*L
for_each(v.begin(), v.end(), _1 = 1 ); =SK+\j$
/* --------------------------------------------- */ w{e3U7;
vector < int *> vp( 10 ); jQxPOl$-
transform(v.begin(), v.end(), vp.begin(), & _1); ,hTwNVWI9
/* --------------------------------------------- */ UC+7-y,
sort(vp.begin(), vp.end(), * _1 > * _2); VU`z|nBW@
/* --------------------------------------------- */ mzV"G>,o
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); /,Dwu?Lcqp
/* --------------------------------------------- */ ]o[X+;Tj|
for_each(vp.begin(), vp.end(), cout << * _1 << ' \n ' ); 3:~l2KIP4
/* --------------------------------------------- */ y@kcXlY
for_each(vp.begin(), vp.end(), cout << constant( ' \n ' ) << * _1); 3 $$5Mk(&