【C++】lambda函数
创始人
2024-02-16 01:14:18
0

27 C++ lambda函数

27.1 lambda函数简介

名称lambda来自lambda calculus(lambda演算),一种定义和应用函数的数学系统。这个系统中可以使用匿名函数,对于接收函数指针或伪函数的函数,可以使用匿名函数定义(lambda)作为其参数。

27.1.1 为什么使用lambda函数?

距离:定义位于使用的地方附近很有用,由于函数不能定义在函数中,编译器传统意义上也不会内联其他地址被获取的函数,因为函数地址的概念意味着非内联函数,仿函数也可以定义在使用附近,因此,lambda和仿函数比函数近

简洁:仿函数代码比函数和lambda繁琐

27.1.2 引入lambda的目的

让程序员能够将类似于函数的表达式用作接收函数指针或仿函数的函数的参数。典型的lambda是测试表达式和比较表达式,可编写一条返回语句。这使得lambda简洁易于理解,且可自动推断返回类型。

27.2 lambda函数的使用

27.2.1 简单使用

//lambda返回类型相当于使用decltyp根据返回值推断得到;如果lambda不包含返回语句,推断出的返回类型将为void。
[](int x) {return x % 3 == 0;}
//使用整个lambda表达式替换函数指针或伪函数构造函数
count3 = std::count_if(numbers.begin(), numbers.end(),[](int x){return x % 3 == 0;});

27.2.2 返回类型后置lambda

//仅当lambda表达式完全由一条返回语句组成时,自动类型推断才管用,否则,需要使用新增的返回类型后置语法
[](double x)->double{int y = x; return x – y;} // return type is double

27.2.3 有名字的lambda函数

auto mod3 = [](int x){return x % 3 == 0;} // mod3 a name for the lambda
//可以像使用函数一样使用带有名字的lambda函数
bool result = mod3(z); // result is true if z % 3 == 0

27.2.4 可访问作用域内任何变量的lambda

//[z]---按值访问变量
//[&count]---按引用访问变量
//[&]---按引用访问所有动态变量
//[=]---按值访问所有动态变量
//[&,ted]---按值访问ted,按引用访问其他动态变量
//其他混合方式也允许
int count13 = 0;
std::for_each(numbers.begin(), numbers.end(),
[&count13](int x){count13 += x % 13 == 0;});//此时count13就可以记录可以整除13的x的数量

27.3 测试程序

27.3.1 代码

/*
Project name :          _33lambda_func
Last modified Date:     2022年5月5日21点04分
Last Version:           V1.0
Descriptions:           C++ 的 lambda用法
*/
#include 
#include 
#include 
#include 
#include 
const long Size1 = 39L;
const long Size2 = 10 * Size1;
const long Size3 = 10 * Size2;
const long Size4 = 10 * Size3;
bool f3(int x) { return x % 3 == 0; }
bool f13(int x) { return x % 13 == 0; }
int main()
{using std::cout;using std::endl;std::vector numbers(Size1);std::srand(std::time(0));std::generate(numbers.begin(), numbers.end(), std::rand);// using function pointerscout << "使用函数指针*********************************************************" << endl;cout << "Sample size = " << Size1 << '\n';long count3 = std::count_if(numbers.begin(), numbers.end(), f3);cout << "Count of numbers divisible by 3: " << count3 << '\n';long count13 = std::count_if(numbers.begin(), numbers.end(), f13);cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
​// increase number of numbersnumbers.resize(Size2);std::generate(numbers.begin(), numbers.end(), std::rand);cout << "使用伪函数***********************************************************" << endl;cout << "Sample size = " << Size2 << '\n';// using a functorclass f_mod{private:int dv;public:f_mod(int d = 1) : dv(d) {}bool operator()(int x) { return x % dv == 0; }};count3 = std::count_if(numbers.begin(), numbers.end(), f_mod(3));cout << "Count of numbers divisible by 3: " << count3 << '\n';count13 = std::count_if(numbers.begin(), numbers.end(), f_mod(13));cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
​// increase number of numbers againnumbers.resize(Size3);std::generate(numbers.begin(), numbers.end(), std::rand);cout << "lambda函数简单使用**************************************************" << endl;cout << "Sample size = " << Size3 << '\n';// using lambdascount3 = std::count_if(numbers.begin(), numbers.end(),[](int x) {return x % 3 == 0; });cout << "Count of numbers divisible by 3: " << count3 << '\n';count13 = std::count_if(numbers.begin(), numbers.end(),[](int x) {return x % 13 == 0; });cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
​// increase number of numbers againnumbers.resize(Size4);std::generate(numbers.begin(), numbers.end(), std::rand);std::generate(numbers.begin(), numbers.end(), std::rand);cout << "Sample size = " << Size4 << '\n';// using lambdascount3 = std::count_if(numbers.begin(), numbers.end(),[](int x) {return x % 3 == 0; });cout << "Count of numbers divisible by 3: " << count3 << '\n';count13 = 0;std::for_each(numbers.begin(), numbers.end(),[&count13](int x) {count13 += x % 13 == 0; });cout << "Count of numbers divisible by 13: " << count13 << "\n\n";// using a single lambdacout << "可访问作用域内任何变量的lambda***************************************" << endl;count3 = count13 = 0;cout << "Sample size = " << Size4 << '\n';std::for_each(numbers.begin(), numbers.end(),[&](int x) {count3 += x % 3 == 0; count13 += x % 13 == 0; });cout << "Count of numbers divisible by 3: " << count3 << '\n';cout << "Count of numbers divisible by 13: " << count13 << "\n\n";cout << "返回类型后置lambda and 有名字的lambda函数****************************" << endl;auto mod3 = [](double x)->double {int y = x; return x - y; };// return type is doubledouble result = mod3(9.99);cout << "result = " << result << endl;return 0;
}

27.3.2 运行结果

使用函数指针*********************************************************
Sample size = 39
Count of numbers divisible by 3: 13
Count of numbers divisible by 13: 1
​
使用伪函数***********************************************************
Sample size = 390
Count of numbers divisible by 3: 138
Count of numbers divisible by 13: 23
​
lambda函数简单使用**************************************************
Sample size = 3900
Count of numbers divisible by 3: 1339
Count of numbers divisible by 13: 306
​
Sample size = 39000
Count of numbers divisible by 3: 13065
Count of numbers divisible by 13: 2949
​
可访问作用域内任何变量的lambda***************************************
Sample size = 39000
Count of numbers divisible by 3: 13065
Count of numbers divisible by 13: 2949
​
返回类型后置lambda and 有名字的lambda函数****************************
result = 0.99
​
D:\Prj\_C++Self\_33lambda_func\x64\Debug\_33lambda_func.exe (进程 2692)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...