<-- Home

C++的lambda表达式

C++11的lambda表达式类似于Ruby的block,也成为被称为匿名函数(闭包)。因为C++ STL中的很多算法函数,比如 sort() 和 find(),这些函数通常需要提供一个谓词函数,所谓谓词函数,就是进行一个操作用的临时函数。比如 find() 需要一个谓词,用于查找元素满足的条件,能够满足谓词函数的元素才会被查找出来。这样的谓词函数,使用临时的匿名函数,既可以减少函数数量,又会让代码变得清晰易读。而且在编译器层面上可以得到更多优化,效率会更高。

Lambda表达式具体形式如下:

[capture](parameters)->return-type{body}
  • 如果没有参数,圆括号()可以省略。
  • 返回类型可以省略,函数体中没有return语句就默认返回类型为void
  • 在Lambda表达式内可以访问当前作用域的变量

通过前面的[capture]来传值或传引用

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

用[=]、[&]、[this]的形式来使用 this 指针。

比如说我们经常用的STL中的sort()函数,如果对结构体等非内置类型元素排序,还需要一个比较函数,如果用Lambda表达式就能很优雅的解决问题啦(像Ruby一样)。

#include<iostream>
#include<algorithm>
using namespace std;

struct Student {
    int id;
    int score;
};

int main() {
    Student st[5] = { {1,62}, {2,56}, {3,78}, {4,92}, {5,81} };
    sort(st, st+5, [](Student &t1, Student &t2){ return t1.score < t2.score; });
    for_each(st, st+5, [](Student &s){ cout << s.id << " " << s.score << endl; });
}