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

yizhihongxing

通过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日

相关文章

  • 深入剖析OpenMP锁的原理与实现

    深入剖析OpenMP锁的原理与实现 什么是OpenMP锁 OpenMP是一种基于共享内存计算模型的多线程并行编程框架,而OpenMP锁则是其中的一种同步机制,用于解决多线程并发执行时的数据同步问题。 OpenMP锁的实现原理 OpenMP锁实现的原理是比较简单的,通过使用线程锁机制来保证不同线程对临界资源的访问顺序以及数据的正确性。 具体来说,OpenMP锁…

    C 2023年5月23日
    00
  • 关于python中逆序的三位数

    关于Python中逆序的三位数,你可以按照以下步骤进行处理: 第一步:输入数字 首先,你可以通过input()函数来从用户那里获取一个三位数。具体代码如下: num = input("请输入一个三位数:") 在该代码中,input()函数会弹出一个提示框,要求用户输入一个三位数,然后将用户输入的内容存储到num变量中。 第二步:判断输入是…

    C 2023年5月22日
    00
  • 用C++实现队列的程序代码

    实现队列的程序代码主要涉及以下内容:数据结构、队列的操作、C++语法等。下面我们一步步来进行讲解。 数据结构 队列可以看成是一种特殊的线性表,它具有先进先出(FIFO)的特点,即先进队列的元素将先输出,后进队列的元素将后输出。 队列通常包含以下几个基本操作:入队、出队、判空和求队列长度等。入队就是将新元素插入到队列的末尾,出队就是将队头元素删除并返回,判空就…

    C 2023年5月23日
    00
  • C++中临时对象的常见产生情况及其解决的方案

    C++中的临时对象,通常表示一些临时生成的对象,这些对象没有名字,在表达式的计算中会被创建和销毁。临时对象经常出现在以下情况中: 函数返回局部对象 函数参数以值传递方式传递 使用运算符等生成的新对象 下面分别对这三种情况进行详细介绍: 函数返回局部对象 如果在函数中定义了一个对象并将其作为返回值返回,则该对象就是一个局部对象。由于该对象是由函数定义的,因此它…

    C 2023年5月22日
    00
  • C语言 解压华为固件的实例代码

    下面我将详细讲解“C语言 解压华为固件的实例代码”的完整攻略。 1. 前置要求 在开始之前,我们需要先安装好以下工具: make gcc git wget 使用如下命令安装: sudo apt-get update sudo apt-get install -y make gcc git wget 2. 获取华为固件压缩包 首先,我们需要从华为的官方网站上获…

    C 2023年5月24日
    00
  • C语言中栈的两种实现方法

    C语言中栈是一种常用的数据结构,常用于程序中的内存管理、函数调用等场景。在C语言中,栈的实现方法主要有两种:数组实现和链表实现。 数组实现 数组实现是一种简单、直接、易于理解和操作的方式。栈的数组实现要求开辟一段连续的内存空间,容量为栈的最大大小,在程序运行时空间大小固定,但在使用时效率高,适合空间比较紧张的场景。 下面是一个数组实现的栈结构的示意代码: #…

    C 2023年5月23日
    00
  • C++实现红黑树应用实例代码

    C++实现红黑树应用实例代码 什么是红黑树 红黑树(Red-Black Tree)是一种自平衡二叉查找树,在C++中的STL中的set和map就是基于红黑树实现的。红黑树满足以下性质: 每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶子节点(NIL节点,空节点)是黑色的。 如果一个节点是红色的,则它的两个子节点都是黑色的。 对于任意一个节点而言,其到…

    C 2023年5月24日
    00
  • c语言判断是否素数程序代码

    当你需要判断一个数是否为素数时,可以使用C语言编写一个程序来实现。下面是一个完整的C语言程序示例: #include <stdio.h> #include <math.h> int is_prime(int num); int main() { int number; printf("请输入一个整数:"); sca…

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