C++ lambda表达式详解

news/2024/11/7 23:39:04/

一、lambda表达式基本用法

1、语法

Lambda 表达式的基本语法如下:
捕获列表 mutable(可选) 异常属性 -> 返回类型
{
// 函数体
}

2、lambda值捕获

/*** @brief lamdba值捕获*/
void test()
{int nvalue = 1;auto func_copyvalue = [nvalue]{return nvalue;};nvalue = 100;auto nValue = func_copyvalue();cout << "value:" << nValue << endl;// 这时, nValue == 1, 而 nvalue == 100.// 因为 func_copyvalue 在创建时就保存了一份 nvalue 的拷贝
}

3、lambda引用捕获

/*** @brief lamdba值捕获*/
void test()
{int nvalue = 1;auto func_copyvalue = [&nvalue]{return nvalue;};nvalue = 100;auto nValue = func_copyvalue();cout << "value:" << nValue << endl;// 这时, nValue == 100, 而 nvalue == 100.// 因为 func_copyvalue 保存的是引用
}

4、lambda隐式捕获

/*
[] 空捕获列表
[name1, name2, ...] 捕获一系列变量
[&] 引用捕获, 让编译器自行推导引用列表
[=] 值捕获, 让编译器自行推导值捕获列表
*/
void test()
{// [] 空捕获列表auto func1 = [](int a) {return a; };// [name1, name2, ...] 捕获一系列变量int name1 = 1;int name2 = 2;int name3 = 3;auto func2 = [name1, name2, name3]() {return name1 + name2 + name3; };// [&] 引用捕获, 让编译器自行推导引用列表auto func3 = [&]() {return name1 + func1(1); };// [=] 值捕获, 让编译器自行推导值捕获列表auto func4 = [=]() {return name1; };
}

5、lambda表达式捕获

上面提到的值捕获、引用捕获都是已经在外层作用域声明的变量,因此这些捕获方式捕获的均为左值,而不能捕获右值。
C++14 给与了我们方便,允许捕获的成员用任意的表达式进行初始化,这就允许了右值的捕获, 被声明的捕获变量类型会根据表达式进行判断,判断方式与使用 auto 本质上是相同的

#include <memory>
#include <utility>
void test()
{auto important = std::make_unique<int>(1);auto add = [v1 = 1, v2 = std::move(important)](int x, int y)->int{return x + y + v1 + (*v2);};cout << add(3, 4) << endl;
}

6、泛型lambda

void test()
{auto add = [](auto x, auto y) {return x + y; };cout << add(3, 4) << endl;cout << add(1, 2) << endl;cout << add(1.1, 2.3) << endl;
}

二、lambda表达式与algorithm相结合使用(记录常用的)

1、std::sort

#include <algorithm>
#include <vector>
void test()
{std::vector<int> vec{1,3,5,2,4,7,9,8,10};std::sort(vec.begin(),vec.end(),[](int a, int b){return a < b;});
}

2、std::for_each

#include <algorithm>
#include <vector>
void test()
{std::vector<int> vecTest{1,3,5,2,4,7,9,8,10};std::for_each(vecTest.begin(), vecTest.end(), [](int n) { return n; });
}

3、std::copy

#include <algorithm>
#include <vector>
void test()
{std::vector<int> m_Vec{1,3,5,2,4,7,9,8,10};std::copy(m_Vec.begin(), m_Vec.end(), ostream_iterator<int>(cout, " "));
}

4、std::function

#include <functional>
#include <map>
#include <string>
void test()
{std::map<std::string, std::function<int(int, int)>> op_dict = {{"+", [](int x, int y){return x + y;}},{"-", [](int x, int y){return x - y;}},{"*", [](int x, int y){return x * y;}},{"/", [](int x, int y){return x / y;}},};
}

5、std::find_if

#include <algorithm>
#include <vector>
void test()
{std::vector<int> vec{ 1,2,3,5,3,7,9,5,10 };auto iter = std::find_if(vec.begin(), vec.end(),[](int a){return a > 5;});
}

6、std::count_if

#include <algorithm>
#include <vector>
void test()
{std::vector<int> vec{ 1,2,3,5,3,7,9,5,10 };auto iter = std::count_if(vec.begin(), vec.end(),[](int a){return a > 5;});
}

三、lambda在线程中使用

#include <thread>
#include <iostream>using namespace std;int main() 
{std::thread tthread001([](int x){cout << x << endl;}, 100);tthread001.join();return 0;
}

http://www.ppmy.cn/news/2115.html

相关文章

SpringBoot —— 整合RabbitMQ常见问题及解决方案

前言 企业中最常用的消息中间件既不是RocketMQ&#xff0c;也不是Kafka&#xff0c;而是RabbitMQ。 RocketMQ很强大&#xff0c;但主要是阿里推广自己的云产品而开源出来的一款消息队列&#xff0c;其实中小企业用RocketMQ的没有想象中那么多。 至于Kafka&#xff0c;主要还是…

python 图形界面“诈金花”游戏,更新了!附完整代码

旧版本的代码请见上一篇博文&#xff1a; python 从一道作业题到制作一个图形界面的“诈金花”游戏_Hann Yang的博客-CSDN博客Player1: (♥Q, ♣2, ♣8) - 单张Player2: (♦10, ♥7, ♠6) - 单张Player3: (♣4, ♠4, ♦2) - 对子Player4: (♠5, ♠9, ♥6) - 单张Player5: (♠…

多数之和问题

文章目录多数求和问题1两数之和(无序)题解2两数之和(有序)题解3两数之和(二叉搜索树)题解4 三数之和题解5四数之和题解多数求和问题 针对给一组用例,和一个目标数target,求用例中多数相加等于target的所有数,且不能重复问题,一般有两种解法: 集合(不要求排序)双指针(要求排序…

springboot基于Java的电影院售票与管理系统毕业设计源码011449

电影院售票与管理系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对电影院售…

JVM—双亲委派

文章目录什么是双亲委派&#xff1f;为什么要有双亲委派原理&#xff1f;破坏双亲委派的例子————————————————————————————————什么是双亲委派&#xff1f; ​ 就是我们写的java源文件到最终运行&#xff0c;必须要经过编译和类加载这两个阶段…

Springboot企业资源管理信息系统kvonv计算机毕业设计-课程设计-期末作业-毕设程序代做

Springboot企业资源管理信息系统kvonv计算机毕业设计-课程设计-期末作业-毕设程序代做 【免费赠送源码】Springboot企业资源管理信息系统kvonv计算机毕业设计-课程设计-期末作业-毕设程序代做本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java…

TCP--三次握手和四次挥手

原文网址&#xff1a;TCP--三次握手和四次挥手_IT利刃出鞘的博客-CSDN博客 简介 本文介绍TCP的三次握手和四次挥手。即&#xff1a;TCP建立连接和断开连接的过程。 三次握手 流程图 主机 A为客户端&#xff0c;主机B为服务端。 第一次握手 A 发送同步报文段&#xff08;SYN…

一篇文章让你搞懂各种压缩,gzip压缩,nginx的gzip压缩,Minification压缩

前言 同学们可能听过这些压缩&#xff0c;但是可能不是了解&#xff0c;这篇文章让你弄清他们 webpack的gzip压缩和nginx的gzip压缩有什么区别&#xff1f;怎样开启gzip压缩&#xff1f;Minfication压缩又是什么鬼&#xff1f;怎样使项目优化的更好&#xff1f;本篇文章讲的是…