【C++】 lambda表达式 解析
2022/8/11 14:28:06
本文主要是介绍【C++】 lambda表达式 解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
为什么使用lambda表达式:
减少定义函数或类的个数
当能推断出参数类型时,用lambda可以省略参数类型,表达式更加简洁
基本形式:
auto func = []() -> void { cout<<"this is the basic form of lambda!"; };
等号左边: lambda表达式名
等号右边: 中括号 [ ] 里是 写在 此lambda表达式之前 此源文件以内 的所有你需要捕获的变量
小括号 ( ) 里是 此lambda表达式的 输入参数
-> void 是C++11引进的后置数据类型,配合auto食用,指返回void。对于返回类型较长的函数,可以使代码更简洁易读
如果把 func = [ ] 看作一个整体记为FUNC,那么整个表达式有点像函数:
auto FUNC() -> void { cout<<"this is the basic form of lambda!"; }; // 除了最后这个分号 ^_^
ps:
很多时候, lambda 表达式的返回值是非常明显的,这时候允许省略返回值定义:
auto func = [] (){ cout<<"this is the basic form of lambda!"; }; //or auto func = [] { cout<<"this is the basic form of lambda!"; };
进一步:
const int x = 9; void test() { int y = 100; } int main() { int a = 0; int b = 1; int c = 2; //----------------------------------- auto func = [=](int t) -> void { cout<<a+b+c+x+t; }; func(6); } // 输出为18
可见,[=]可以获取不仅main函数里面的一切变量,还能获得main外面的全局变量;
由作用域可知,不可以获得其他函数体内的局部变量。
但是[=]又是什么意思呢?为什么不直接[ ]?
[ ]表示 不捕获外部变量
[=]表示 按值传递的方式捕获 表达式前的所有可捕获的变量
//但是这种捕获方式无法修改捕获的值 int a = 0; auto func = [=] { ++a; // error };
// 加个 mutable 就可以了 (mutable:不定的) auto func = [=]() mutable { ++a; };
[&]表示 按引用的方式捕获 表达式前的所有可捕获的变量
exp:
[x,&y]表示 我想要捕获的x和y,x默认按值捕获,y按引用捕获
[this] 如果在类内,我们还可以捕获this指针,并且可以用来修改成员;
但是当this指针所指的对象被析构时,这有可能造成指针悬空的问题,理论上用shared_ptr可以解决。
应用场景:
用得比较多的应该是 STL的算法吧,像sort,for_each,transform这些: 比如:vector<int> v; sort(v.begin(), v.end(), [] ( int n1, int n2 ) { return n1 > n2; });
不用lambda的话就得另起几行写个函数再传回来,不是很优雅嗷(虽然c++这个语言本身就不怎么优雅)
这篇关于【C++】 lambda表达式 解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享