lambda函数(表达式)

1. 概念

  • C++11中的lambda表达式用于定义和调用匿名函数
  • lambda函数又称为lambda表达式
  • 当某个函数比较短小且只需要调用一次时,可以定义为lambda函数。

    2. 语法格式

  • ->返回值类型{函数体}(实参列表);

    • eg: [](int a, int b)->int{return a + b;}(1, 2);
  • 当函数体中没有return语句或者只有一个return语句时,” ->返回值类型 “可以省略,因为编译器可以自动推导。
    • {return a + b;}(1, 2);
  • 当函数体中没有使用形参时,”(形式列表)”可以省略
    • []{cout << “hello world”<< endl;}();

3. 访问动态变量

  • lambda函数内部可以访问作用域内任何动态变量,要捕获要使用的变量,可将名称的相关形式放在中括号内。
    • eg: [c](int a, int b){return a +b+c;}
  • 具有如下几种形式及其混合形式: | [z] | 按值访问变量z | | —- | —- | | [&z] | 按引用访问变量z,若在函数内部改变z的值,则它的外面也跟着改变 | | [&] | 按引用访问所有动态变量 | | [=] | 按值访问所有动态变量 | | [ted, &ted1] | 按值访问ed和按引用访问ed1 | | etc…… | |

4. 常用场景

  • 用作通用算法的函数型参数
  • 通讯处理函数的传参(实参)

5. 示例代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int main(){
  6. int r = 0;
  7. r = [](int a, int b)->int{return a + b;}(1, 2);
  8. cout << "r = " << r << endl;
  9. r = [](int a, int b){return a + b;}(3, 4);
  10. cout << "r = " << r << endl;
  11. []{cout << "hello lambda" << endl;}();
  12. vector<int> intVector{9, 5, 2, 7};
  13. for_each(intVector.begin(), intVector.end(),
  14. [](int a){cout << a << " ";});
  15. cout << endl;
  16. sort(intVector.begin(), intVector.end(), [](int a, int b){return a > b;});
  17. for_each(intVector.begin(), intVector.end(),
  18. [](int a){cout << a << " ";});
  19. cout << endl;
  20. return 0;
  21. }