一. 什么是Lambda 6f\0YU<C&
所谓Lambda,简单的说就是快速的小函数生成。 9bNjC&:4/]
在C++中,STL的很多算法都要求使用者提供一个函数对象。例如for_each函数,会要求用户提供一个表明“行为”的函数对象。以vector<bool>为例,如果想使用for_each对其中的各元素全部赋值为true,一般需要这么一个函数对象, XB50>??NE
h<$V ry}
,*bI0mFZ
\3O#H
class filler >]&LbUW+
{ }ytc oIuLf
public : |9?67-
void operator ()( bool & i) const {i = true ;} c03A_2%
} ; oz(<e
f:KKOLm
_$9<N5F.,o
这样实现不但麻烦,而且不直观。而如果使用lambda,则允许用户使用一种直观和见解的方式来处理这个问题。以boost.lambda为例,刚才的问题可以这么解决: A@?2qX^4
;Tvy)*{
kC!7<%(
]O,!B''8k
for_each(v.begin(), v.end(), _1 = true ); ]$EKowi
)^|zuYzN
:05>~bn>pC
那么下面,就让我们来实现一个lambda库。 kgEGL]G>
:eo2t>zF-<
xzyV|(
"e&S*8QhM
二. 战前分析 W&A22jO.1
首先要说明的是,我并没有读过boost.lambda或其他任何lambda库的代码,因此如代码有雷同,纯属巧合。 =SRp
开始实现以前,首先要分析出大致的实现手法。先让我们来看几段使用Lambda的代码 c#<v:b
>dUnk)7
2w $o;zz1
for_each(v.begin(), v.end(), _1 = 1 ); %F3M\)jU
/* --------------------------------------------- */ d?$FAy'o5
vector < int *> vp( 10 ); }mxy6m ,
transform(v.begin(), v.end(), vp.begin(), & _1); pa~.[cBI
/* --------------------------------------------- */ :K#'?tH
sort(vp.begin(), vp.end(), * _1 > * _2); 2ZNTj u7h
/* --------------------------------------------- */ xm6=l".%z
int b = * find_if(v.begin, v.end(), _1 >= 3 && _1 < 5 ); ^.&