C++精要分析lambda表达式的使用

通过lambda表达式,我们可以以简洁、灵活的方式定义一个匿名函数。在C++11标准中,引入了lambda表达式语法,可以帮助我们在C++中更加方便地使用匿名函数。下面是关于C++ lambda表达式使用的完整攻略。

1. lambda 表达式的基本语法

lambda表达式的一般形式为:

[capture list](parameters) mutable(optional) exception attribute -> return_type { function_body }
  • 参数列表(parameters):类似于函数的参数列表,可以包含多个参数,以逗号隔开。
  • 可变性指示符(mutable):表示lambda表达式中的代码是否能够修改其所捕获的值,在默认情况下,lambda表达式不会修改捕获的变量。
  • 捕获列表(capture list):表示lambda表达式所捕获的变量。
  • 返回类型(return type):表示lambda表达式的返回值类型。
  • 函数体(function body):包含lambda表达式的执行代码。

2. lambda 表达式的基本使用

下面是一个简单的示例,展示如何使用lambda表达式定义一个匿名函数:

auto f = [](int x, int y) { return x + y; };
int res = f(2, 3); // res 的值为 5

我们可以对lambda表达式进行赋值,然后像普通的函数一样进行调用。在这个例子中,lambda表达式定义了一个以x和y为参数的函数,返回x+y。定义lambda表达式时,可以使用任意支持的语法来指定函数体,只要保证函数体可以返回类型正确的值即可。

3. lambda 表达式捕获变量

在lambda表达式中,捕获变量是一个很重要的概念,它允许我们访问在lambda表达式范围外的变量。捕获的变量可以是全局变量、静态变量、局部变量、形参以及this指针。在捕获变量时,lambda表达式通过以下方式对捕获的变量进行区分:

  • 按值捕获:以值传递方式捕获变量。
  • 引用捕获:以引用传递方式捕获变量。

以下示例展示了lambda表达式中的值捕获和引用捕获的区别:

int x = 2;
auto f1 = [x]() { return x; }; // 值捕获,x 的值被复制
auto f2 = [&x]() { return x; }; // 引用捕获,x 的引用被传递
x = 5;
int res1 = f1(); // res1 的值为 2
int res2 = f2(); // res2 的值为 5

在这个示例中,我们定义了一个变量x,然后定义了两个lambda表达式,一个以值捕获方式,一个以引用捕获方式捕获变量x。接着,我们改变了变量x的值,然后调用两个lambda表达式,它们分别返回新的和旧的变量x的值。值捕获的lambda表达式得到的是捕获时变量的值,而引用捕获的lambda表达式得到的是变量被修改后的值。

4. lambda 表达式使用示例

下面是两个使用lambda表达式的示例:

4.1 排序算法

在排序算法中,我们可以使用lambda表达式作为排序算法的比较函数。以下是一个以lambda表达式为比较函数的快速排序算法示例:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void quicksort(vector<int>& vec) {
    if (vec.size() <= 1)
        return;
    else {
        int pivot = vec[vec.size() / 2];
        vector<int> left;
        vector<int> right;
        vector<int> pivot_list;
        for (int i:vec) {
            if (i < pivot) {
                left.push_back(i);
            }
            else if (i > pivot) {
                right.push_back(i);
            }
            else {
                pivot_list.push_back(i);
            }
        }
        quicksort(left);
        quicksort(right);
        vec.clear();
        vec.insert(vec.end(), left.begin(), left.end());
        vec.insert(vec.end(), pivot_list.begin(), pivot_list.end());
        vec.insert(vec.end(), right.begin(), right.end());
    }
}

int main() {
    vector<int> vec {5, 3, 9, 7, 2, 4, 1, 8, 6};
    auto cmp = [](int a, int b) { return a < b; }; // lambda表达式作为比较函数
    sort(vec.begin(), vec.end(), cmp);
    for (auto i:vec) {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

在这个示例中,我们定义了一个函数quicksort,它以vector作为参数,使用lambda表达式作为比较函数进行排序。在主函数中,我们定义了一个vector,然后定义了一个lambda表达式作为比较函数传递给sort函数,输出已排序的vector。

4.2 使用STL算法和lambda表达式

在使用STL算法时,我们通常需要使用函数对象(functor),例如less、greater等。在C++11中,我们可以使用lambda表达式代替函数对象,使代码更加清晰。以下是一个示例,展示了如何使用lambda表达式和for_each算法对vector进行求和:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> vec {1, 2, 3, 4, 5};
    int sum = 0;
    auto add_sum = [&sum](int n) { sum += n; }; // lambda表达式作为函数对象
    for_each(vec.begin(), vec.end(), add_sum);
    cout << "Sum is " << sum << endl;
    return 0;
}

在这个示例中,我们定义了一个vector,然后定义了一个lambda表达式作为函数对象,使用for_each算法对vector中所有元素进行了求和。在lambda表达式中,我们捕获了变量sum,并将每个元素加入sum中。最后,我们输出了求和结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++精要分析lambda表达式的使用 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 笔记本开机进不去系统 错误代码0xc000000f的解决办法

    笔记本开机进不去系统 错误代码0xc000000f的解决办法 引言 当笔记本电脑启动后无法进入操作系统时,它会显示一个蓝屏幕并提示错误代码0xc000000f。这种情况可能会让人感到困惑和不安,但好消息是,许多人已经找到了一些解决办法,可以帮助你快速修复这个问题。 在本篇攻略中,我们将详细解释什么是错误代码0xc000000f和可能引起此错误的原因。同时,我…

    C 2023年5月23日
    00
  • C指针原理教程之语法树及其实现

    C指针原理教程之语法树及其实现 什么是语法树 语法树是编译原理中的概念,指的是代码在编译过程中形成的一种树型结构,用来表示代码的语法结构。 例如下面这段代码: int add(int a, int b) { return a + b; } int main() { int x = 1; int y = 2; int z = add(x, y); return…

    C 2023年5月23日
    00
  • Golang json 库中的RawMessage功能原理

    完整攻略:Golang json 库中的 RawMessage 功能原理 1. RawMessage是什么 在Golang中,RawMessage 是一个预定义类型,它用于存储任意未经处理的 JSON 数据。 它允许我们将复杂的任意 JSON 对象作为struct中的一部分而不必定义对应的struct。 2. RawMessage的使用方法 2.1 Unma…

    C 2023年5月23日
    00
  • C语言之整数划分问题(递归法)实例代码

    C语言之整数划分问题(递归法)实例代码是一篇介绍整数划分问题及其递归解法的文章,并提供了C语言代码实现。下面将详细讲解这篇文章的内容。 整数划分问题简介 首先,文章介绍了整数划分问题的背景和定义。整数划分问题的定义是:将一个正整数$n$划分成不超过$n$个正整数的和,每个划分方案中的数都必须不小于$1$,且不考虑顺序。例如,对于$4$这个数字,可以划分为以下…

    C 2023年5月24日
    00
  • C语言之详解静态变量static

    C语言之详解静态变量static 在C语言中,关键字static可以用于修饰全局变量,局部变量和函数,其作用分别如下: 1. 修饰全局变量 在全局变量前加上static关键字,表示该变量具有静态存储期和静态链接属性。 在同一文件中的其他函数中不能访问该变量。 只能被定义变量的函数访问。 被初始化为0,除非在定义时显式初始化。 static int a; //…

    C 2023年5月24日
    00
  • Go语言的JSON处理详解

    Go语言的JSON处理详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。JSON是JavaScript原生支持的数据格式,因此可以被广泛应用于AJAX技术,通过HTTP请求发送JSON数据,实现网页与服务器之间的数据交互。 Go语言中的JSON Go…

    C 2023年5月23日
    00
  • c++11 atomic的使用详解

    下面是关于”C++11 atomic的使用详解”的完整攻略。 什么是atomic atomic是一个C++11标准中的类模板,可用于实现原子操作。原子操作是一种不可分割的操作,要么成功执行,要么不执行,不会被其他线程中断。使用atomic可以确保并发访问下的线程安全。 基础用法 atomic支持内部类型如int、long等的原子操作。下面是一些基本的示例: …

    C 2023年5月22日
    00
  • 基于C++自动化编译工具的使用详解

    基于C++自动化编译工具的使用详解 什么是自动化编译工具 自动化编译工具可以帮助我们简化编译过程,减少手动操作,提高编译效率,节省时间。目前常见的一些自动化编译工具有Makefile、CMake、SCons等。 其中,Makefile是最原始、最传统的自动化编译工具,他是通过规定一系列源文件、头文件、编译参数、依赖关系等,使代码能够被快速编译成可执行文件。 …

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部