關於boost中lambda表示式的學習

2021-06-29 13:40:35 字數 3096 閱讀 2547

一些簡單的例子:

使容器中的元素都減去5

std::for_each(vec.begin(), vec.end(), _1 -= 5);

計算容器中元素所有和

int nsum = 0;

std::for_each(vec.begin(), vec.end(), nsum += _1);

基礎:1. 建立乙個無參的lambda表示式: 

boost::functionfunc = boost::lambda::constant(a + 5);

2. 定義lambda表示式常量與變數 可以lambda表示式中進行運算

常量:boost::lambda::constant_type::type var1;

變數:boost::lambda::var_type::type    var2;

如: using boost::lambda::constant_type;

using boost::lambda::var_type;

constant_type::type var1(boost::constant(value));

var_type::type var2(boost::lambda::var(value));

注意以上的定義式 常量需要使用boost::constant包裝 變數需要使用boost::lambda::var包裝

void foo(int);

void foo(float);

bind(&foo, _1)(i) //error 不能正確的找到函式位址 存在二義性

解決方案:

void (*pf1)(int) = &foo; //定義函式指標變數

bind(pf1, _1)(i) //ok 將呼叫void foo(int) 函式

關於bind函式的其他注意事項:是否修改本身的問題(以及效能)

class a

void set_i(int k);

a a;

int k;

bind(&a::set_i, a, _1)(k); //a被複製 如果修改a的話 只是修改了副本 類似於函式的傳值呼叫

bind(&a::set_i, &a, _1)(k);//a的指標被複製 如果修改a的話 將修改a自身 類似於函式的傳指標呼叫

bind(&a::set_i, boost::ref(a), _1)(k);//a被傳引用 如果修改a的話 將修改a自身 類似於函式的傳引用呼叫

bind(&a::set_i, _1, 1)(k);//a被傳引用 如果修改a的話 將修改a自身 類似於函式的傳引用呼叫

除了第乙個bind外 其他的都是穿類似引用的方式呼叫成員函式 第乙個bind效能沒有其他三個的優

4. lambda的控制結構

if_then(condition, then_part);

if_then_else(condition, the_part, else_pari);

if_then_else_return(condition, then_part, else_part);

while_loop(condition, body);

while_loop(condition);

do_while_loop(condition, body);

do_while_loop(condition);

for_loop(init, condition, increment, body);

for_loop(init, condition, increment);

除了if_then_else_return有返回型別 其他的都返回void

對二維陣列每個元素進行+1

int a[5][10];

int i;

std::for_each(a, a+5, for_loop(var(i) = 0, var(i) < 10, ++var(i), _1[var(i)] += 1));

5. 巢狀的stl演算法 計算二維陣列中所有的和

#include

using boost::lambda::ll;

int a[100][200];

int nsum = 0; 

std::for_each(a, a+100, bind(ll::for_each(), _1, _1 + 200, protect(nsum += _1));

命名空間中還有很多類似ll::for_each的類似stl函式, 大家可以盡情的發揮想象力

以上更為標準的寫法如下:

std::for_each(a.begin(), a.end(), bind(ll::for_each(), bind(call_begin(), _1), bind(call_end(), _1), protect(nsum += _1)));

6. boost::bind 與boost::lambda::bind的區別

template

int nested(fun fun)

int k = 10;

bind(fun, _1)(k);

int bar(int a, int b)

return a + b;

nested(boost::lambda::bind(bar, 1, _1)) => bar(1, x)(x); 最終編譯不過 可以使用unlambda函式進行解決

nested(boost::bind(bar, 1, _1)) => bar(1, x) 符合預期值 順利通過

boost::bind 有最多9個佔位符

boost::lambda::bind 有最多3個佔位符

7. 構造與析構

constructor()(arg_list);

destructor()(a);

destructor()(pa);

new_ptr()(arg_list)

new_array()(sz);

delete_ptr()(p);

delete_array()(p);

型別轉換函式

ll_static_cast

ll_dynamic_cast

ll_const_cast

ll_reinterpret_cast

ll_sizeof

ll_typeid

關於Python中的lambda

lambda是python程式語言中使用頻率較高的乙個關鍵字。那麼,什麼是lambda?它有哪些用法?這裡,我們通過閱讀各方資料,總結了關於python中的lambda的 乙個語法,三個特性,四個用法,乙個爭論 乙個語法 在python中,lambda的語法是唯一的。其形式如下 lambda arg...

關於Python中的lambda

lambda是python程式語言中使用頻率較高的乙個關鍵字。那麼,什麼是lambda?它有哪些用法?網上的文章汗牛充棟,可是把這個講透的文章卻不多。這裡,我們通過閱讀各方資料,總結了關於python中的lambda的 乙個語法,三個特性,四個用法,乙個爭論 在python中,lambda的語法是唯...

關於python中lambda 函式使用小結

例子 如果定義普通函式,一般都是這樣寫 def ds x return 2 x 1 呼叫即 ds 5 如果用lambda函式就是這麼寫,就是一句話 g lambda x 2 x 1 呼叫 g 5 以這樣認為,lambda作為乙個表示式,定義了乙個匿名函式,冒號左邊x為入口引數,右邊x 1為函式體 計...