lambda in c++
2018-03-25 14:46
411 查看
lambda
在c++11中lambda表达式用来实现匿名函数,而匿名函数在容器使用中有着非常大的用途。语法
[ captures ] ( params ) -> ret { body }[ captures ] ( params ) { body }
[ captures ] { body }
这里比较不容易理解的是captures的含义,其取不同值的含义如下:
[] // 不捕获任何外部变量 [=] // 以值的形式捕获所有外部变量 [&] // 以引用形式捕获所有外部变量 [this] //captures the current object (*this) by reference [x, &y] // x 以传值形式捕获,y 以引用形式捕获 [=, &z]// z 以引用形式捕获,其余变量以传值形式捕获 [&, x] // x 以值的形式捕获,其余变量以引用形式捕获
使用
lambda主要可以使用在两个场景:- 在容器中使用
- 通过定义std::function来使用
容器中的使用
void sort() { std::vector<int> v_array; for (int i = 0; i < 10; i++) { v_array.push_back(i); } //指定按照a > b进行排序 std::sort(v_array.begin(), v_array.end(), [](int a, int b){ return a > b; }); //通过lambda对a_varray中的每一项进行输出 std::for_each(v_array.begin(), v_array.end(), [](int a){ std::cout<<a<<" "; }); std::cout<<std::endl; std::sort(v_array.begin(), v_array.end(), [](int a, int b){ return a < b; }); std::for_each(v_array.begin(), v_array.end(), [](int a){ std::cout<<a<<" "; }); std::cout<<std::endl;
执行结果为:
tingshuai@yantingshuaideMacBook-Air ~/self_code/c++11$ ./a.out 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9
通过引用使用
void function() { std::string msg="hey boy"; auto f1 = [&] (){ std::cout<<msg<<std::endl; }; f1();//使用外部变量 std::function<void (const std::string&msg)> f2 = [] (const std::string&msg){ std::cout<<msg<<std::endl; }; f2("hello world");//使用参数 }
上面的例子中,f1和f2分别采用不同的方式来使用lambda expression:
- f1通过auto来推导出lambda的类型,并且通过引用来使用外部变量
- f2通过std::function来引用lambda expression,并通过参数的形式来传递希望打印的内容
参考
c++ Lambda函数学习Lambda expressions
相关文章推荐
- Lambda Expressions in C++
- C++ 11: lexical closure in lambda function, example 1
- Lambda Expressions in C++
- Lambda expression in C++ & Haskell || C++ 中的匿名函数 [EN/CN]
- Recursive Lambda in C++
- Recursive Lambda in C++
- The Usage of Lambda and Heap in the C++ STL
- The C++ In-Depth Series
- Effective Modern C++ 笔记 第六章 Lambda Expressions
- C++中关于assign 0 to _debugger_hook_dummy so that the function is not folded in retail的错误
- How to start a second thread in an MFC-based ActiveX control to fire events in Visual C++
- C++经典错误 already defined in *****.obj 解决方法
- Understanding and Implementing Factory Pattern in C++
- C/C++: Inline function, calloc vs malloc
- Thinking in C++读书摘要
- 开始看thinking in c++
- 《Thinking in C++》学习笔记(二)【第三章】
- leetcode 230 Kth Smallest Element in a BST C++
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
- leetcode_c++: Find Minimum in Rotated Sorted Array II(154)