淺談Boost庫中l(wèi)ambda的使用
lambda庫通過創(chuàng)建一個(gè)匿名的lambda表達(dá)式來代替實(shí)名的函數(shù)對(duì)象,大大簡化了標(biāo)準(zhǔn)庫的語法。下面我們來看一個(gè)hello world級(jí)的lambda表達(dá)式:
- (cout << _1 << " " << _3 << " " << _2)("Welcome"," cnblog ","to");
其中,_1、_2和_3稱為占位符,用以表示第幾個(gè)參數(shù)。
在“Boost庫之bind的使用”一文中,我們用bind實(shí)現(xiàn)了找出一個(gè)整數(shù)容器中大于5但小于10的元素的個(gè)數(shù),現(xiàn)在我們嘗試用lambda來完成這項(xiàng)工作。
- int nCount = count_if(vctTemp.begin(), vctTemp.end(), _1>5 && _1<10);
可以看到,相對(duì)于使用bind進(jìn)行函數(shù)對(duì)象的綁定,使用lambda使得語法更顯簡潔,邏輯也更覺清晰。
在lambda表達(dá)式中,還有一個(gè)非常重要的概念就是常量和變量的延遲,舉例如下:
- for_each(vctTemp.begin(),vctTemp.end(), cout << ' ' << _1);
該函數(shù)的本意是想在輸出每一元素前都加一個(gè)空格,但由于cout << ' '不是一個(gè)lambda表達(dá)式,因此,它會(huì)被立即輸出求值。為了實(shí)現(xiàn)延遲輸出的目的,我們需要使用constant函數(shù),以創(chuàng)建一個(gè)lambda仿函數(shù)。
- for_each(vctTemp.begin(),vctTemp.end(), cout << constant(' ') << _1);
以上是常量延遲調(diào)用的例子,下面來看一下變量的延遲調(diào)用。
- int nIndex = 0;
- for_each(vctTemp.begin(),vctTemp.end(), cout << ++nIndex << _1<
只會(huì)被求值一次。為了在每次調(diào)用時(shí)都能輸出序號(hào),需要使用var函數(shù),以創(chuàng)建一個(gè)lambda仿函數(shù)。
- for_each(vctTemp.begin(),vctTemp.end(), cout << ++var(nIndex) << _1<另外,還可以將一個(gè)lambda表達(dá)式賦給一個(gè)function,從而實(shí)現(xiàn)延遲調(diào)用。
- function fAdd = cout << _1 << "+" << _2 << "=" <<_1+_2 << endl;
- fAdd (1,2);
- fAdd (3,4);
以上介紹了lambda庫的一些基本功能。lambda庫的更強(qiáng)大之處在于,它提供了一些用于控制結(jié)構(gòu)的函數(shù)模板,比如:if_then、if_then_else、if_then_else_return、while_loop、do_while_loop、for_loop、switch_statement等。下面
if_then_else為例,介紹其用法。
- for_each(vctTemp.begin(),vctTemp.end(),if_then_else(_1%2==0,cout<<_1<< '\n',cout<