C++ 新特性 lamada表达式

2024-02-04 23:12
文章标签 c++ 特性 表达式 lamada

本文主要是介绍C++ 新特性 lamada表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章来介绍一下lamada表达式吧  lamada表达式相信大家已经很熟悉了 这里再总结一下

1.lamada表达式语法:

[capture-list] (parameter-list) -> return-type { body }

  • capture-list:捕获列表,用于指定在lambda函数体中可访问的外部变量。
  • parameter-list:参数列表,类似于普通函数声明中的参数列表。
  • return-type:返回类型,指定lambda表达式返回值类型。
  • { body }:函数体,实现lambda表达式要执行的操作。

请看代码实例:

#include <iostream>int main() {int x = 5;// Lambda 表达式auto lambda = [x](int y) -> int {return x + y;};int result = lambda(3); // 调用 lambda 函数std::cout << "Result: " << result << std::endl; // 输出结果return 0;
}

在上述示例中,我们定义了一个lambda表达式,并将其赋值给了一个auto类型的变量lambda。该lambda表达式捕获了外部变量x,并接受一个整型参数y。它执行了一个加法操作,并返回结果。最后,在main函数中调用了lambda并打印了结果。

注意 return-type这个部分可以省略 一般编译器会自动推导 当然写上去也没有什么错

lamada表达式捕获列表的应用:

假设lamada表达式作用域里面的变量是x

1.[&x]  表示的是在lamada表达式作用域里面通过引用的方式获取值

2.[=]  表示通过值的方式获取作用域里面所有值的复制品

3.[=x]  表示通过值的方式获取作用域里面x值的复制品

4.[&] 表示通过引用的方式获取作用域里面所有值

5.[]   啥也不干 躺平 哈哈哈

代码实例:

#include <iostream>int main() {int x = 5;const auto lambda = [=]() {//x++; // 错误:对被捕获的变量进行修改std::cout << "x: " << x << std::endl; // 访问函数内的局部变量 x};lambda(); // 调用 Lambda 函数return 0;
}

敲重点 

Lambda表达式是一种可调用的对象,它可以通过括号运算符 () 来执行相应的操作。当我们使用括号运算符来调用Lambda表达式时,实际上是在对Lambda对象进行函数调用操作。

这种语法设计使得Lambda表达式能够像函数一样被调用,具有类似于普通函数的行为。使用括号来调用Lambda表达式非常直观和方便,与传统的函数调用方式保持了一致性。

注意 lamada表达式中同时使用mutable和const是没有意义的

int main() {int x = 10;// 编译错误:不能同时使用mutable和constauto lambda = [x]() mutable const {x = 20;return x;};return 0;
}

STL使用lamada表达式  代码实例

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用 find_if 和 Lambda 表达式查找大于3的第一个元素auto it = std::find_if(numbers.begin(), numbers.end(), [](int num) {return num > 3;});if (it != numbers.end()) {std::cout << "找到了大于3的第一个元素:" << *it << std::endl;} else {std::cout << "未找到符合条件的元素" << std::endl;}return 0;
}

广义捕获

1.简单捕获 就是上述内容

2.初始化捕获

初始化捕获代码实例:

#include <iostream>
using namespace std;
int main() 
{int x = 5;auto fool = [R = x + 1](){return R;};fool();return 0;
}

在上述代码中,我们使用初始化捕获将 x+1 的结果赋值给了变量 R。Lambda 表达式 foo 捕获了 y,并返回它的值。

通过调用 foo(),即可执行 Lambda 表达式并输出结果。在本例中,输出为 6

泛型lamada表达式:

泛型 Lambda 表达式是 C++14 引入的特性,它允许我们在 Lambda 表达式中使用 auto 参数来实现对不同类型的通用操作。这样可以提高代码的灵活性和可复用性。

代码实例: 

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};// 使用泛型 Lambda 表达式打印容器中的元素std::for_each(nums.begin(), nums.end(), [](const auto& num) {std::cout << num << " ";});std::cout << std::endl;return 0;
}

在上述代码中,我们使用了泛型 Lambda 表达式来遍历并打印一个整数向量中的所有元素。Lambda 表达式的参数部分使用了 auto 关键字来表示其类型会根据传入的参数自动推导。这样,无论向量中存储的是什么类型(整数、浮点数、字符串等),都可以通过该 Lambda 表达式进行处理。

通过调用 std::for_each 算法,并传入该泛型 Lambda 表达式作为参数,即可完成遍历和打印操作。

总结:lamada表达式 应用于C++的各个地方 深入了解lamada表达式的用法 参数列表 捕获列表 函数体块 关键字(const mutable)的使用  能够很好的简化代码的量 避免冗余代码的发生 很好的优化了代码

好了本篇文章就到这里为止了 在这里小编想给大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

这篇关于C++ 新特性 lamada表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679088

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关