青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 24,  comments - 62,  trackbacks - 0

Boost.Lambda是什么?

Boost Lambda庫是C++模板庫,以C++語言實(shí)現(xiàn)了lambda抽象.Lambda這個(gè)術(shù)語來自函數(shù)編程語言和lambda閉包理論,lambda抽象實(shí)際上定義了匿名函數(shù).了解過C#新引入的匿數(shù)函數(shù)特性或Lisp編程的人,對這些概念理解會有很大幫助.Lambda庫設(shè)計(jì)的主要?jiǎng)訖C(jī)是為STL算法提供靈活方便的定義匿名函數(shù)對象的機(jī)制.這個(gè)Lambda庫究竟是有什么用呢?代碼勝千言!看下面將STL容器中的元素打印到標(biāo)準(zhǔn)輸出上的代碼.

for_each(a.begin(), a.end(), std::cout << _1 << ' ');

表達(dá)式std::cout << _1 << ' '定義了一元函數(shù)對象.變量_1是函數(shù)的形參,是實(shí)參的占位符.每次for_each的迭代中,函數(shù)帶著實(shí)際的參數(shù)被調(diào)用,實(shí)際參數(shù)取代了占位符,然后函數(shù)體里的內(nèi)容被執(zhí)行.Lambda庫的核心就是讓你能像上面所展示的那樣,在STL算法的調(diào)用點(diǎn),定義小的匿名函數(shù)對象.

Lambda庫的安裝

Lambda庫只由頭文件組成,這就意味著你不需要進(jìn)行任何編譯,連接,生成二進(jìn)制庫的動作,只需要boost庫頭文件路徑包含進(jìn)你的工程中即可使用.

與現(xiàn)代的C++語言一樣,在使用時(shí)你需要聲明用到的名字空間,把下列的代碼包含在你的源文件頭:

using namespace boost::lambda;

Boost Lambda庫的動機(jī)

在標(biāo)準(zhǔn)模板庫STL成為標(biāo)準(zhǔn)C++的一部分后,典型的STL算法對容器中元素的操作大都是通過函數(shù)對象(function objects)完成的.這些函數(shù)作為實(shí)參傳入STL算法.

任何C++中以函數(shù)調(diào)用語法被調(diào)用的對象都是函數(shù)對象.STL對某些常見情況預(yù)置了些函數(shù)對象.比如:plus,less,not1下面就是標(biāo)準(zhǔn)plus模板的一種可能實(shí)現(xiàn):
template <class T> 
struct plus : public binary_function <T, T, T> {
  T operator()(const T& i, const T& j) const {
    return i + j; 
  }
};

基類binary_function<T, T, T>包含了參數(shù)和函數(shù)對象返回類型的類型定義,這樣可使得函數(shù)對象可配接.

除了上面提到的基本的函數(shù)對象外,STL還包含了binder模板,將可配接的二元函數(shù)中的某個(gè)實(shí)參固定為常量值,來創(chuàng)建一個(gè)一元函數(shù)對象.比如:

class plus_1 {
  int _i;
public:
  plus_1(const int& i) : _i(i) {}
  int operator()(const int& j) { return _i + j; }
};

上面的代碼顯性地創(chuàng)建了一個(gè)函數(shù)對象,將其參數(shù)加1.這樣的功能可用plus模板與binder模板(bind1st來等效地實(shí)現(xiàn).舉例來說,下面的兩行表達(dá)式創(chuàng)建了一個(gè)函數(shù)對象,當(dāng)它被調(diào)用時(shí),將返回1與調(diào)用參數(shù)的和.

plus_1(1)
bind1st(plus<int>(), 1)

plus<int>就是計(jì)算兩個(gè)數(shù)之和的函數(shù)對象.bind1st使被調(diào)用的函數(shù)對象的第一個(gè)參數(shù)綁定到常量1.作為上面函數(shù)對象的使用示例,下面的代碼就是將容器a中的元素加1后,輸出到標(biāo)準(zhǔn)輸出設(shè)備:

transform(a.begin(), a.end(), ostream_iterator<int>(cout),
          bind1st(plus<int>(), 1));

為了使binder更加通用,STL包含了適配器(adaptors)用于函數(shù)引用與指針,以及成員函數(shù)的配接.

所有這些工具都有一個(gè)目標(biāo),就是為了能在STL算法的調(diào)用點(diǎn)有可能指定一個(gè)匿名的函數(shù),換句說,就是能夠使部分代碼片斷作為參數(shù)傳給調(diào)用算法函數(shù).但是,標(biāo)準(zhǔn)庫在這方面只做了部分工作.上面的例子說明用標(biāo)準(zhǔn)庫工具進(jìn)行匿名函數(shù)的定義還是很麻煩的.復(fù)雜的函數(shù)調(diào)用表達(dá)式,適配器,函數(shù)組合符都使理解變得困難.另外,在運(yùn)用標(biāo)準(zhǔn)庫這些方法時(shí)還有明顯的限束.比如,標(biāo)準(zhǔn)C++98中的binder只允許二元函數(shù)的一個(gè)參數(shù)被綁定,而沒有對3參數(shù),4參數(shù)的綁定.這種情況在TR1實(shí)施后,引進(jìn)了通用的binder后可能改善,對于使用MSVC的程序員,有興趣還可以查看下微軟針對VS2008發(fā)布的TR1增強(qiáng)包.

但是不管怎樣,Lambda庫提供了針對這些問題比較優(yōu)雅的解決方法:

  • 對匿名函數(shù)以直觀的語義進(jìn)行創(chuàng)建,上面的例子可改寫成:

    transform(a.begin(), a.end(), ostream_iterator<int>(cout), 
              1 + _1);
    

    更直觀點(diǎn):

    for_each(a.begin(), a.end(), cout << (1 + _1));
    
  • 絕大部分對函數(shù)參數(shù)綁定的限制被去除,在實(shí)際C++代碼中可以綁定任意的參數(shù)

  • 分離的函數(shù)組合操作不再需要了,函數(shù)組合被隱性地支持.

Lambda表達(dá)式介紹

Lambda表達(dá)在函數(shù)式編程語言中很常見.在不同語言中,它們的語法有著很大不同,但是lambda表達(dá)式的基本形式是:

lambda x1...xn.e

lambda表達(dá)式定義了匿名函數(shù),并由下列的元素組成

  • 函數(shù)的參數(shù):x1...xn
  • 表達(dá)式e,以參數(shù)x1...xn的形式計(jì)算函數(shù)的值

一個(gè)簡單的lambda表達(dá)式的例子是:

(lambda x y.x+y) 2 3 = 2 + 3 = 5 

在lambda表達(dá)式的C++版本中,表達(dá)式中x1...xn不需要,已預(yù)定義形式化的參數(shù).在現(xiàn)在Boost.Lambda庫中,存在三個(gè)這樣的預(yù)定義的參數(shù),叫做占位符:_1,_2,和_3.它們分別指代在lambda表達(dá)式中的第一,二,三個(gè)參數(shù).比如,下面這樣的lambda表達(dá)式:

lambda x y.x+y

C++定義的形式將會是這樣:

_1 + _2

因此在C++中的lambda表達(dá)式?jīng)]有語義上所謂的關(guān)鍵字.占位符作為運(yùn)算符使用時(shí)就隱性地意味著運(yùn)算符調(diào)用是個(gè)lambda表達(dá)式.但是只有在作為運(yùn)算符調(diào)用才是這樣.當(dāng)Lambda表達(dá)式包含函數(shù)調(diào)用,控制結(jié)構(gòu),轉(zhuǎn)換時(shí)就需要特殊的語法調(diào)用了.更為重要的是,作為函數(shù)調(diào)用是需封裝成binder函數(shù)的形式.比如,下面這個(gè)lambda表達(dá)式:

lambda x y.foo(x,y)

不應(yīng)寫成foo(_1,_2),對應(yīng)的C++結(jié)構(gòu)應(yīng)如下:

bind(foo, _1, _2)

對于這種表達(dá)式,更傾向于作為綁定表達(dá)式bind expressions

lambda表達(dá)式定義了C++的函數(shù)對象,因此,對于函數(shù)調(diào)用的形式跟其他的函數(shù)對象一樣,比如:(_1 + _2)(i, j).

性能

性能,運(yùn)行效率,總是C++程序員關(guān)心的話題.理論上,相對于手寫循環(huán)代碼,使用STL算法和Lambda函數(shù)對象的所有運(yùn)行開銷,可以通過編譯優(yōu)化消除掉.這種優(yōu)化取決于編譯器,實(shí)際中的編譯器大都能做到.測試表明,性能會有下降,但是影響不大,對于代碼的效率和簡潔之間的權(quán)衡,只能由程序員自己做出判斷了.

Lambda庫的設(shè)計(jì)與實(shí)現(xiàn)中大量運(yùn)用了模板技術(shù),造成對于同一模板需要大量的遞歸實(shí)例化.這一因素可能使構(gòu)建復(fù)雜邏輯的lambda表達(dá)式,不是一個(gè)非常理想的做法.因?yàn)榫幾g這些表達(dá)式需要大量的內(nèi)存,從而使編譯時(shí)間變得非常慢,這在一些大型項(xiàng)目中會更加突出.還有在發(fā)生編誤錯(cuò)誤時(shí),引發(fā)的大量錯(cuò)誤信息,不能有效地指出真正錯(cuò)誤之處.最后點(diǎn),C++標(biāo)準(zhǔn)建議模板的嵌套層次不要超過17層來防止導(dǎo)致無限遞歸,而復(fù)雜的Lambda表達(dá)式模板會很容易超過這一限制.雖然大多數(shù)編譯器允許更深層次的模板嵌套,但是通常需要顯性地傳入一個(gè)命令行參數(shù)才能做到.

參考

大多數(shù)內(nèi)容是從Boost.Lambday庫在線文檔參考翻譯而成

posted on 2008-05-18 16:03 len 閱讀(8676) 評論(5)  編輯 收藏 引用 所屬分類: 程序開發(fā)

FeedBack:
# re: Boost.Lambda簡述
2008-05-19 10:41 | 周星星
好文章耶  回復(fù)  更多評論
  
# re: Boost.Lambda簡述[未登錄]
2008-05-20 20:27 | bneliao
不錯(cuò),  回復(fù)  更多評論
  
# re: Boost.Lambda簡述
2009-02-26 11:10 | re: Boost.Lambda簡述
re: Boost.Lambda簡述  回復(fù)  更多評論
  
# re: Boost.Lambda簡述
2011-04-22 17:33 | Soli
好文!  回復(fù)  更多評論
  
# re: Boost.Lambda簡述[未登錄]
2013-02-02 14:56 | Victor
C++ 11 已經(jīng)完全支持 lambda表達(dá)式了  回復(fù)  更多評論
  

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三| 亚洲欧美日韩人成在线播放| 麻豆九一精品爱看视频在线观看免费| 亚洲视频专区在线| 亚洲美女毛片| 日韩午夜av在线| 99精品99| 亚洲图片自拍偷拍| 亚洲欧美一区二区三区极速播放| 亚洲性感美女99在线| 亚洲网站在线播放| 欧美在线一二三| 欧美freesex8一10精品| 欧美极品aⅴ影院| 欧美亚洲成人免费| 国产色综合久久| 亚洲国产一成人久久精品| 亚洲欧洲日夜超级视频| 日韩一二三在线视频播| 亚洲一级免费视频| 亚洲高清在线播放| 久久久国产成人精品| 榴莲视频成人在线观看| 亚洲国产精品成人| 一本色道久久综合一区| 欧美一区日本一区韩国一区| 快射av在线播放一区| 欧美视频在线观看| 一区二区三区在线看| 中日韩午夜理伦电影免费| 久久精品一区四区| 亚洲破处大片| 亚洲欧美日本国产有色| 欧美高清视频| 国内成人精品2018免费看| 日韩一级网站| 美女被久久久| 亚洲欧美视频一区二区三区| 欧美成人综合网站| 狠狠色狠狠色综合日日五| 亚洲一区国产一区| 亚洲高清视频在线| 欧美在线高清| 国产精品女主播在线观看| 亚洲精选视频免费看| 嫩模写真一区二区三区三州| 亚洲综合日韩中文字幕v在线| 欧美精品一二三| 亚洲电影自拍| 久久久亚洲精品一区二区三区 | 亚洲电影有码| 久久久噜噜噜久久人人看| 国产精品日韩一区二区| 亚洲一区bb| 夜夜嗨av一区二区三区中文字幕 | 国产精品五月天| 在线视频精品一| 亚洲经典自拍| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美亚洲综合网| 国产精品区一区二区三区| 在线一区免费观看| 最新日韩在线视频| 欧美国产日产韩国视频| 亚洲高清一区二区三区| 亚洲欧美日韩国产一区二区| 亚洲精品国产精品国自产在线| 久久五月天婷婷| 久久精品99久久香蕉国产色戒| 国产亚洲精品福利| 久久久视频精品| 老司机凹凸av亚洲导航| 亚洲国产一区二区三区在线播| 欧美a级片网站| 欧美久色视频| 欧美一区二区三区男人的天堂| 午夜欧美精品| 欧美在线不卡视频| 亚洲九九爱视频| 欧美精品一区二区三区在线看午夜 | 国产精品红桃| 欧美在线综合视频| 久久久www成人免费毛片麻豆| 国产在线视频不卡二| 欧美成人午夜影院| 欧美日韩视频在线第一区| 香蕉成人久久| 榴莲视频成人在线观看| 一区二区精品国产| 午夜精品视频在线观看| 在线观看中文字幕不卡| 99视频在线观看一区三区| 国产欧美日韩伦理| 欧美激情亚洲综合一区| 国产精品久久久久免费a∨ | 免费成人你懂的| 欧美日韩中文在线观看| 久久九九全国免费精品观看| 欧美**人妖| 久久成人免费网| 欧美日韩国产va另类| 久久在线免费| 国产精品欧美激情| 亚洲国产三级| 一区二区视频免费完整版观看| 夜夜精品视频| 在线一区二区三区做爰视频网站 | 黄色成人av| 一区二区三区.www| 亚洲盗摄视频| 性欧美精品高清| 亚洲性视频h| 欧美成人a视频| 久久五月天婷婷| 国产精品专区h在线观看| 亚洲日本成人女熟在线观看| 国产中文一区二区三区| 亚洲视频精选在线| 亚洲最新在线| 欧美福利电影在线观看| 久久综合狠狠| 国产资源精品在线观看| 亚洲性视频网站| 亚洲一区二区三区午夜| 欧美人交a欧美精品| 欧美激情一区二区三区| 狠狠色综合播放一区二区| 亚洲综合导航| 香蕉成人伊视频在线观看| 欧美日韩一区成人| 亚洲精品日韩久久| 日韩手机在线导航| 欧美日本高清一区| 亚洲黄色免费网站| 亚洲精品久久久蜜桃| 麻豆精品在线视频| 欧美激情久久久久| 亚洲欧洲在线播放| 欧美v国产在线一区二区三区| 欧美1级日本1级| 亚洲国产精品一区| 女仆av观看一区| 亚洲精品四区| 亚洲午夜av| 国产乱理伦片在线观看夜一区| 亚洲中字黄色| 久久中文在线| 亚洲精品偷拍| 欧美午夜宅男影院| 亚洲欧美日韩精品在线| 欧美在线视频在线播放完整版免费观看| 国产精品久久久久免费a∨大胸| 这里只有精品在线播放| 性xx色xx综合久久久xx| 国产一区二区三区av电影| 久久精品99久久香蕉国产色戒 | 亚洲高清不卡av| 一区二区三区日韩欧美精品| 国产精品成人va在线观看| 午夜精品久久久久久久久久久久久 | 免费成人高清视频| 亚洲免费不卡| 国产精品久久久久久久免费软件| 亚洲欧美日韩成人高清在线一区| 欧美精品麻豆| 亚洲欧美日韩精品| 午夜在线精品偷拍| 欧美一区二区私人影院日本| 国产精品影视天天线| 久久国产成人| 亚洲激情一区二区| 亚洲欧美一区二区精品久久久| 国产精品一区二区三区观看| 久久成人免费日本黄色| 亚洲激情一区二区| 久久精品中文字幕一区| 亚洲二区在线视频| 欧美性淫爽ww久久久久无| 久久精品久久综合| 夜夜精品视频| 亚洲二区视频在线| 久久激情中文| 99国产精品| 精品99视频| 国产精品久久久久久久久动漫| 久久久一区二区三区| 亚洲午夜91| 最新国产乱人伦偷精品免费网站| 久久精品国产久精国产爱| 亚洲精品美女91| 国内精品久久久久影院薰衣草| 欧美午夜国产| 欧美国产三区| 久久综合久久久| 欧美一区二区三区四区夜夜大片 | 欧美黄色aaaa| 久久久午夜电影| 欧美一区二区私人影院日本 | 亚洲欧美另类在线观看| 亚洲三级视频|