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

posts - 24,  comments - 62,  trackbacks - 0

Boost.Lambda是什么?

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

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

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

Lambda庫的安裝

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

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

using namespace boost::lambda;

Boost Lambda庫的動機

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

任何C++中以函數調用語法被調用的對象都是函數對象.STL對某些常見情況預置了些函數對象.比如:plus,less,not1下面就是標準plus模板的一種可能實現:
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>包含了參數和函數對象返回類型的類型定義,這樣可使得函數對象可配接.

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

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

上面的代碼顯性地創建了一個函數對象,將其參數加1.這樣的功能可用plus模板與binder模板(bind1st來等效地實現.舉例來說,下面的兩行表達式創建了一個函數對象,當它被調用時,將返回1與調用參數的和.

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

plus<int>就是計算兩個數之和的函數對象.bind1st使被調用的函數對象的第一個參數綁定到常量1.作為上面函數對象的使用示例,下面的代碼就是將容器a中的元素加1后,輸出到標準輸出設備:

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

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

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

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

  • 對匿名函數以直觀的語義進行創建,上面的例子可改寫成:

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

    更直觀點:

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

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

Lambda表達式介紹

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

lambda x1...xn.e

lambda表達式定義了匿名函數,并由下列的元素組成

  • 函數的參數:x1...xn
  • 表達式e,以參數x1...xn的形式計算函數的值

一個簡單的lambda表達式的例子是:

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

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

lambda x y.x+y

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

_1 + _2

因此在C++中的lambda表達式沒有語義上所謂的關鍵字.占位符作為運算符使用時就隱性地意味著運算符調用是個lambda表達式.但是只有在作為運算符調用才是這樣.當Lambda表達式包含函數調用,控制結構,轉換時就需要特殊的語法調用了.更為重要的是,作為函數調用是需封裝成binder函數的形式.比如,下面這個lambda表達式:

lambda x y.foo(x,y)

不應寫成foo(_1,_2),對應的C++結構應如下:

bind(foo, _1, _2)

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

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

性能

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

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

參考

大多數內容是從Boost.Lambday庫在線文檔參考翻譯而成

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

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

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(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>
            国产精品久久久久久超碰| 亚洲欧美精品中文字幕在线| 欧美成熟视频| 久久综合国产精品| 老司机精品久久| 免费日韩成人| 欧美日韩国产成人精品| 国产精品成人va在线观看| 国产精自产拍久久久久久蜜| 久久精品中文字幕免费mv| 蜜臀av国产精品久久久久| 久久嫩草精品久久久久| 久久久久久有精品国产| 免费亚洲电影在线| 欧美午夜美女看片| 狠狠狠色丁香婷婷综合久久五月 | 国产精品入口福利| 国产日韩精品一区二区三区| 韩日精品在线| 一区二区三区视频在线播放| 香蕉成人啪国产精品视频综合网| 久久久久久亚洲精品中文字幕| 免费短视频成人日韩| 亚洲欧洲日本国产| aaa亚洲精品一二三区| 欧美一区亚洲| 欧美日韩免费看| 在线观看视频日韩| 香蕉久久国产| 亚洲乱亚洲高清| 久久一区中文字幕| 国产精品色婷婷久久58| 最近看过的日韩成人| 午夜精品亚洲| 亚洲免费观看在线观看| 久久综合给合| 激情久久久久| 久久av在线| 日韩一级黄色大片| 免费看黄裸体一级大秀欧美| 国产精品综合视频| 亚洲一区二区三区免费在线观看| 欧美96在线丨欧| 亚洲欧美日韩精品久久奇米色影视| 久久影音先锋| 国内精品一区二区| 欧美在线3区| 一区二区三区视频观看| 欧美日韩国产成人在线免费| 亚洲第一二三四五区| 久久九九有精品国产23| 亚洲影院在线| 国产精品入口麻豆原神| 性色av一区二区三区红粉影视| 亚洲精品一区二区三区樱花| 模特精品在线| 亚洲人成在线观看| 欧美国产第一页| 美女福利精品视频| 亚洲激情在线观看视频免费| 久久综合久久综合九色| 久久久久国色av免费观看性色| 国产欧美精品一区| 欧美在线视频在线播放完整版免费观看| 欧美国内亚洲| 激情成人中文字幕| 久久久久久久一区| 欧美一级专区| 伊人成综合网伊人222| 久久亚洲欧美| 美女视频一区免费观看| 亚洲精品色婷婷福利天堂| 亚洲国产欧美不卡在线观看| 欧美电影在线观看完整版| 亚洲欧洲一区二区在线播放| 亚洲欧洲美洲综合色网| 国产精品国产三级国产aⅴ入口| 亚洲制服丝袜在线| 午夜久久tv| 亚洲国产美女| 一二三区精品福利视频| 国产日韩在线一区| 欧美大色视频| 欧美三级视频在线| 久久国产色av| 女人色偷偷aa久久天堂| 亚洲一区二区三区在线视频| 欧美一区二区三区四区夜夜大片| 在线看欧美日韩| 99精品黄色片免费大全| 国产午夜精品美女毛片视频| 欧美刺激性大交免费视频| 国产精品va在线| 另类国产ts人妖高潮视频| 欧美日韩1区2区3区| 久久久91精品国产一区二区三区| 男女精品视频| 久久精品中文字幕一区二区三区 | 欧美日韩另类在线| 香蕉久久久久久久av网站| 久久亚洲国产精品日日av夜夜| 亚洲精品视频免费观看| 亚洲欧美日韩精品| 99亚洲一区二区| 久久久久久亚洲精品杨幂换脸 | 免费观看成人鲁鲁鲁鲁鲁视频| 欧美88av| 久久久久一区二区| 欧美视频免费| 亚洲黄色精品| 在线精品福利| 欧美一级免费视频| 亚洲一区二区在线免费观看视频| 久久精品在线视频| 欧美亚洲午夜视频在线观看| 欧美精品在线免费观看| 狂野欧美激情性xxxx| 国产精品免费视频观看| 亚洲国产免费| 亚洲狠狠婷婷| 久久看片网站| 久久久午夜精品| 国产欧美精品一区二区三区介绍| 亚洲伦理在线观看| 亚洲免费观看| 欧美粗暴jizz性欧美20| 久久国产一二区| 亚洲宅男天堂在线观看无病毒| 久久人人爽人人爽爽久久| 久久福利影视| 国产欧美 在线欧美| 亚洲夜间福利| 午夜精品一区二区三区四区 | 欧美色图五月天| 亚洲国产一区视频| 亚洲美女网站| 欧美日韩福利视频| 亚洲免费成人av电影| 99国产精品久久| 欧美精品一区二区三区蜜臀| 亚洲国产一区二区三区青草影视| 日韩视频中文| 欧美日韩亚洲综合| 亚洲一级特黄| 久久视频在线免费观看| 在线成人免费视频| 欧美a级一区二区| 亚洲九九九在线观看| 亚洲在线视频观看| 国产一区av在线| 每日更新成人在线视频| 亚洲人成网站精品片在线观看| 99这里只有久久精品视频| 欧美午夜大胆人体| 欧美一区在线直播| 亚洲福利视频网| 在线视频精品| 国产日韩欧美二区| 你懂的国产精品永久在线| 日韩一级片网址| 久久不射网站| 亚洲激精日韩激精欧美精品| 欧美精品一区二区三区久久久竹菊| 这里是久久伊人| 久久久国产精品一区| 亚洲国产一区在线| 国产精品扒开腿做爽爽爽视频| 亚洲欧美美女| 欧美好骚综合网| 欧美一级淫片aaaaaaa视频| **欧美日韩vr在线| 欧美日韩久久精品| 欧美一区二区三区男人的天堂 | 欧美久久一区| 亚洲欧美日本国产有色| 欧美91视频| 欧美一区2区三区4区公司二百| 一区一区视频| 国产精品久久久久免费a∨大胸 | 国产精自产拍久久久久久蜜| 久久综合给合久久狠狠色| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲欧洲一区二区三区久久| 午夜精品久久久99热福利| 1204国产成人精品视频| 国产精品久久久亚洲一区| 美女日韩在线中文字幕| 亚洲欧美日韩第一区| 99视频精品全部免费在线| 欧美不卡一卡二卡免费版| 欧美一区二区国产| 中国av一区| 亚洲乱码国产乱码精品精98午夜| 国产一区久久久| 国产精品女主播| 欧美午夜欧美| 欧美日韩国产专区| 欧美激情精品久久久久久| 久久免费精品视频| 久久国产高清|