????????C++11???????????????????漰??C++11??θ????н???????lambda??????
????????toy code??????????????????o?????????
????lambda ???
???????Python??????????lambda??????????????lambda??????????????????顣??C++11?±???У?lambda????????????
????[capture list] (parameter list) -> return type { function body }
???????????????????????????
????1??capture list?? ?????б?
????2??parameter list?? ?????б?
????3??return type?? ????????
????4??function body?? ??д???
???????У??????б????????????????
???????棬???忴?????????????
????auto f1 = [] { return 1; };
????auto f2 = [] () { return 2; };
????cout<<f1()<<' '<<f2()<<endl;
?????????б?
????lambda?е?????б??????????????????????á?
???????????
????int test_data[] = {1?? 5?? 9?? 7?? 3?? 19?? 13?? 17};
????int border = 8;
????auto f3 = [border](const int &i){ if(i > border) cout<<i<<' '; };
????for_each(begin(test_data)?? end(test_data)?? f3);
????cout<<endl;
?????????????
????auto f4 = [&border](const int &i){ if(i > border) cout<<i<<' '; };
????border = 6;
????for_each(begin(test_data)?? end(test_data)?? f4);
????cout<<endl;
???????????????????lambda?????????border???????6??????????????????á?
??????????????????????????????????lambda????????????????????Ч??
?????????б?????????????????????????????????lambda????д??????ж??????????Щ?????????
??????????????????????????????????
char space = ' ';
auto f5 = [=](const int &i){ if(i > border) cout<<i<<' '; };
auto f6 = [&](const int &i){ if(i > border) cout<<i<<' '; };
auto f7 = [&?? space](const int &i){ if(i > border) cout<<i<<space; };
border = 0;
for_each(begin(test_data)?? end(test_data)?? f5);
cout<<endl;
for_each(begin(test_data)?? end(test_data)?? f6);
cout<<endl;
for_each(begin(test_data)?? end(test_data)?? f7);
cout<<endl;
?????????f7??????????????????“????space??????????????????????????”??
??????? lambda
??????lambda?????????????????????????????????lambda????mutable????????????б??????
????auto f8 = [&?? space](const int &i) mutable { if(i > border) {cout<<i<<space; space=' ';} };
????for_each(begin(test_data)?? end(test_data)?? f8);
????cout<<endl;
????cout<<1<<space<<2<<endl;
??????????п????????space??lambda f8?е?????????ε?????????????????Tab;??????lambda???space???????
????????????
????lambda????????????β?÷?????????????????
????1??lambda????????return?????????????????????????????????????????????????
????2???????????????lambda????void????????void???????????????κξ??????????????????????ì????????????????????????
????????????????????????g++????????????????????2?????????????????lambda?????????????????????????????????????????????????磺
????auto f9 = [](const int i){if(i % 3) return i * 3; else return i;};
????transform(begin(test_data)?? end(test_data)?? begin(test_data)?? f9);
????border = 0;
????for_each(begin(test_data)?? end(test_data)?? f6);
????cout<<endl;
????lambda????????ж??return??????????if/else???????????????????return??????????????????????int???????????????β?÷????????
???????????????????????????????????????????????????????£?????????????????????????
????auto f10 = [](const int i) -> double
????{if(i % 5) return i * 5.0; else return i;};
????transform(begin(test_data)?? end(test_data)?? begin(test_data)?? f10);
????for_each(begin(test_data)?? end(test_data)?? f6);
????cout<<endl;
???????
????· lambda????????? [capture list] (parameter list) -> return type { function body }??????parameter list??return type????????
????· ?????б????????[val]??????????????[&ref]??
????· ?????б?????????????????????????в????[=]?????????[&]????????????????????????[&?? val]????[=?? &ref]??
????· ??lambda?????????????????????mutable??????
????· ??lambda????????????????????????????β?÷??????????????????