一些簡單的例子:
使容器中的元素都減去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為函式體 計...