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