C++:函数指针进阶(三):Lambda函数详解:概念详解

1:Lambda函数语法

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);

 2:Lambda表达式应用实例

lambda表达式原理: 就是函数对象更高级的实现!

现在我们看一下:通过 Lambda表达式对 Vector进行排序

// main.cpp


#include<vector>
#include<algorithm>
#include<iostream>
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++ 标准库中 这个模板类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值