// Copyright [2021] <Copyright Ziliu>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
// 匿名函数 lambda表达式
/*
auto func = [=]() mutable throw() -> int {
int ret = a + b;
a += 1;
return ret;
}
1. [=]: 用于指明函数内使用函数变量的方式为“值传递(=)”还是“引用传递(&)”
2. (): 设置参数列表
3. mutable: mutable状态
4. throw(): 抛出异常
5. int: 返回值类型
看起来似乎非常复杂,但在实际使用中常常只需要关注前两项即可。
*/
int main() {
int a = 1;
int b = 3;
// 1.
// 当使用值传递的时候,外部的a和b的值并不会变化,只是影响了内部的复制品。
// 而匿名函数内部的变量具有记忆性,第二次调用的时候内部的变量a的值已经被修改了。
auto func = [=]() mutable throw() -> int {
int ret = a + b;
a += 1;
return ret;
};
int ret = func();
std::cout << "a = " << a << ", ret =" << ret << std::endl;// "a = 1, ret = 4"
ret = func();
std::cout << "a = " << a << ", ret =" << ret << std::endl;// "a = 1, ret = 5"
// 2.
// 下面使用引用传递,则内部变量的a2是引用进去的
int a2 = 1;
int b2 = 3;
auto func2 = [&]() mutable throw() -> int {
int ret = a2 + b2;
a2 += 1;
return ret;
};
int ret2 = func2();
std::cout << "a2 = " << a2 << ", ret2 =" << ret2 << std::endl;// "a2 = 2, ret2 = 4"
ret2 = func2();
std::cout << "a2 = " << a2 << ", ret2 =" << ret2 << std::endl;// "a2 = 3, ret2 = 5"
// 3. 常见的写法
int ret3 = [](int x, int y) -> int { return x+y; }(1, 2);
/*
ret3 = [](int x, int y) { return x+y; }(1, 2);
[] 内部为空,则说明当前匿名函数的内部不使用外部的变量
(1,2) 是传入的参数
这也表明了当前的匿名函数只在这里使用一次
*/
std::cout << ret3 << std::endl;
// 4. 匿名函数与STL的一起使用,sort(arr.begin(),arr.end(), lambda)
std::vector<int> arr{5,3,6,1,7,2};
sort(arr.begin(), arr.end(), [](int x, int y){ return x > y;});
// 定义一个print的匿名函数用于vector类型的输出
auto print = [](std::vector<int> vec){
int size = vec.size();
for(size_t i = 0; i < size - 1; i++) {
std::cout << vec[i] << " ";
}
std::cout << vec[size-1] << std::endl;
};
print(arr);
// 5. 匿名函数嵌套(不建议嵌套使用,逻辑不清晰)
int c = 1, d = 2;
int ret5 = [=](){
return c + [=]() {
return d*d;
}();
}();
std::cout << ret5 << std::endl;
return 0;
}
【Ubuntu】C++匿名函数的使用实例(代码)
最新推荐文章于 2024-03-13 16:10:40 发布