lambda表达式

Lambda 表达式

作用

用于定义一个匿名函数对象。

语法

{}

[]捕获子句。
在 lambda 所在的作用域中,哪些变量可以在 lambda 函数体中使用。
捕获分为值方式、引用方式。
如果 [] 为空,表示不会捕获任何变量。
[=] 按值捕获外部所有变量,[&] 按引用捕获外部所有变量。
() 参数列表。
mutable 加上之后,lambda 函数体可以修改按值捕获的变量。 可选。(去除const性)
throw() 异常选项
throw() 表示不抛出任何异常
throw(A, B) 表示只抛出 A 和 B 两种类型的异常。
省略表示可以抛出任何类型异常
-> int lambda 匿名函数返回类型

示例

void test_lambda()
{
  	//() 函数调用符号
    // 1. 无捕获、无参数、无返回值、可抛出任何异常
    []{cout << "hello world" << endl; }();

	int v1 = 100, v2 = 200;

    // 2. 无捕获、有参数、有返回值, 可抛出任何异常
    int ret1 = [](int para1, int para2) {return para1 + para2; }(10, 20);
    int ret2 = [](int para1, int para2)-> int {return para1 + para2; }(10, 20);

    cout << "ret1 = " << ret1 << endl;
    // 3. 以值的方式捕获所有外部变量(具有const性)
    int ret3 = [=]() {return v1 + v2; }();
    cout << "ret3 = " << ret3 << endl;

    // 捕获的值不能修改,必须加 mutable 才能修改 v1、v2 的值
    int ret4 = [=]() mutable {v1 = 10; v2 = 20;  return v1 + v2; }();

    // 4. 以引用方式捕获外部所有变量
    int ret5 = [&]() {return v1 + v2; }();

    // 5. 以值得方式捕获v1、以引用的方式捕获 v2
    int ret6 = [v1, &v2]() {return v1 + v2; }();
}

匿名函数使用默认参数

示例

void test
{
	int ret = ([](int a = 10, int b = 20) -> int {
		return a + b;
	})();

	ret = ([](int a = 10, int b = 20) -> int {
		return a + b;
	})(100);

ret = ([](int a = 10, int b = 20) -> int {
		return a + b;
	})(100, 200);

}

匿名函数可以保存

示例:

//1. auto lambda类型
	auto my_func1 = []() {cout << "hello world" << endl; };
	my_func1();

//2. 函数指针来保存, 注意点: []只能为空,不能写东西
	void(*my_func2)() = []() {cout << "hello world" << endl; };
	my_func2();

//3. std::function 来保存 <返回值的类型>(参数类型)
	function<void()> my_func3 = []() {cout << "hello world" << endl; };
	my_func3();

//选着排序
void select_sort(void *addr, size_t ele_size, size_t ele_count, int(*comapre)(void*, void*))
{

	for (size_t i = 0; i < ele_count; ++i)
	{
		// 定义 min 变量,保存最小值的下标
		int min = i;  // 假设 i 是最小值

		for (size_t j = i + 1; j < ele_count; ++j)
		{

			char *j_addr = (char *)addr + j * ele_size;
			char *min_addr = (char *)addr + min * ele_size;

			// arr[j] -> *(arr + j)

			if (comapre(j_addr, min_addr))
			{
				min = j;
			}
		}

		// 临时内存用于交换
		char *temp = (char *)malloc(ele_size);

		if (min != i)
		{
			char *i_addr = (char *)addr + i * ele_size;
			char *min_addr = (char *)addr + min * ele_size;

			memcpy(temp, i_addr, ele_size);
			memcpy(i_addr, min_addr, ele_size);
			memcpy(min_addr, temp, ele_size);
		}
	}
}



void test()
{

//测试调用匿名函数
int arr[] = { 9, 3, 2, 1, 7, 6, 4, 5 };
	select_sort(arr, sizeof(int), sizeof(arr) / sizeof(arr[0]), [](void *d1, void *d2) ->int {
		int *dd1 = (int *)d1;
		int *dd2 = (int *)d2;
		return *dd1 < *dd2 ? 1 : 0;
	});

	for (auto v : arr)
	{
		cout << v << " ";
	}
	cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值