C++ 语法的基本格式为:
[capture](parameters) -> return_type { /* ... */ }
(1) [capture] :[]内为外部变量的传递方式,值、引用等,如下
[] //表示的是在lambda定义之前的域,对外部参数的调用;
[=] //表示外部参数直接传值
[&] //表示外部参数传引用,可修改值。当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。而当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始。
[x, &y] //x is captured by value, y is captured by reference
[&, x] //x is explicitly captured by value. Other variables will be captured by reference
[=, &z] //z is explicitly captured by reference. Other variables will be captured by value
(2)(parameters) :()内为形参,和普通函数的形参一样。
(3)-> return_type:->后面为lambda函数的返回类型,如
-> int
、-> string
等。一般情况下,编译器推出lambda函数的返回值,所以这部分可以省略不写。(4){ /* … */ }: {}内为函数主体,和普通函数一样。
举例:定义 lambda函数
auto add = [](int a,int b) ->int { return a + b; };
此处为 lambda函数定义,所以左边为函数指针类型变量,一般懒的写函数指针类型,可以直接赋值给 auto类型变量。
lambda函数使用、运行
方法一:直接用 auto 变量接收 lambda函数返回值
auto add = [](
int
a,
int
b) ->
int
{
return
a + b; };
int
result = add(1,2);
方法二:定义函数指针接收 lambda函数返回值
auto add = [](int a,int b) ->int { return a + b; };
int(*func_ptr)(int,int) = add ;
int result = func_ptr(1,2);
lambda表达式原理: 就是函数对象更高级的实现!
现在我们看一下:通过 Lambda表达式对 Vector进行排序
- // main.cpp
-
-
- #include
- #include
- #include
- int main() {
- std::vector<int> vec;
- for (int i = 0; i < 3; i++)
- {
- vec.push_back(i);
- }
-
- // 定义lambda比较器传给 sort函数做比较.做降序排列(注意 sort函数默认阿是升序排列的)
- std::sort(vec.begin(), vec.end(), [](int a, int b)->bool {
- return a > b;
- });
-
- //打印比较后的结果
- for (int val : vec) {
- std::cout << val << std::endl;
- }
-
- }
-
- // 打印结果
- 2
- 1
- 0
总结:前两篇我们分析了:函数指针,函数对象指针,Lambda表达式用法,这三种情况下,其实代码还是比较繁琐复杂的,那么我们可以想一下,是否可以有一种简单的技术,来把这些情况都包含起来了 ?按照面向对象的思想,来处理这些情况了 ? 有的,C++中 std::function 这个类就是可以实现。
std::function是C++标准库中的一个模板类,用来保存一个函数、仿函数或lambda表达式。
好,下篇文章我们就分析 C++ 标准库中 这个模板类。