详解C++11中的lambda匿名函数

yizhihongxing

关于“详解C++11中的lambda匿名函数”的完整攻略,我将分以下几个方面展开:

一、什么是lambda表达式?

lambda表达式是C++11标准中引入的新特性,它是一个匿名函数,可以在需要函数的地方直接定义函数并执行。

通常情况下,函数都需要在定义后才能被调用,而lambda表达式可以直接定义后立即执行。它非常方便,在一些场景下(如STL算法、函数式编程等)可以替代传统的函数调用方式。

二、lambda表达式语法

lambda表达式的语法非常简洁明了,如下所示:

[capture list] (parameters) -> return type { function body }
  • capture list:包含零个或多个捕获列表的方括号[]。如果没有需要捕获的变量,可以留空。捕获列表用于指定lambda函数能够访问的外部变量。
  • parameters:函数参数列表,和正常的函数定义一样,可以为空。
  • return type:函数返回值类型,可以省略,编译器会自动根据函数体中的返回语句进行推导。
  • function body:函数体,包含在花括号{}中,可以包含任意数量的语句。

下面是一个简单的示例,使用lambda表达式定义一个函数对象并调用:

auto hello = []() { std::cout << "Hello, world!" << std::endl; };
hello(); // output: Hello, world!

这里我们使用auto关键字自动推导hello对象的类型,它是一个函数对象类型。使用()调用函数对象,输出了Hello, world!字符串。

三、lambda表达式的捕获列表

在前面的语法中,我们提到了lambda表达式的捕获列表,它用于指定lambda函数能够访问的外部变量。捕获列表的语法有三种:

1. 按值捕获

int a = 10;
auto func = [a]() { std::cout << "a = " << a << std::endl; };
a = 20;
func(); // output: a = 10

这里的[a]表示按值捕获变量a,即lambda表达式在定义时会把a的值复制一份,之后再使用。因此在修改a的值后调用func()对象时,输出的值仍然是10。

2. 按引用捕获

int b = 100;
auto func = [&b]() { std::cout << "b = " << b << std::endl; };
b = 200;
func(); // output: b = 200

这里的[&b]表示按引用捕获变量b,即lambda表达式在定义时会引用b的地址,之后再使用。因此在修改b的值后调用func()对象时,输出的值也会被更新。

3. 按引用捕获,并保持只读

int c = 1000;
auto func = [&c]() { std::cout << "c = " << c << std::endl; };
c = 2000;
func(); // output: c = 2000

这里的[&c]表示按引用捕获变量c,同时添加const限定符,使其只读不可修改。因此在修改c的值后调用func()对象时,输出的值还是之前的值1000。

四、lambda表达式的应用

lambda表达式在STL算法、函数式编程等场景下有广泛的应用。下面是两个示例:

1. 使用STL算法和lambda表达式实现排序

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

int main() {
    std::vector<int> vec = {1, 3, 2, 5, 4};
    std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; });
    for (auto i : vec) std::cout << i << " "; // output: 1 2 3 4 5
    return 0;
}

这里调用了std::sort算法,使用lambda表达式定义了排序规则(从小到大排列),实现了对整个vector的排序功能。

2. 使用lambda表达式实现函数式编程

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result;
    std::transform(vec.begin(), vec.end(), std::back_inserter(result),
        [](int i) { return i * i; });
    for (auto i : result) std::cout << i << " "; // output: 1 4 9 16 25
    return 0;
}

这里调用了std::transform算法,使用lambda表达式定义了变换规则(对每个元素求平方),实现了函数式编程中的map功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++11中的lambda匿名函数 - Python技术站

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

相关文章

  • javascript-简单的计算器实现步骤分解(附图)

    “javascript-简单的计算器实现步骤分解(附图)”是一篇讲解JS实现简单计算器的文章,下面我会一步步详细讲解这篇文章。 1. 确定计算器功能 首先,要明确这个计算器需要实现哪些功能。这篇文章中,该计算器需要实现加、减、乘、除四种运算,同时还需要具备清空、删除计算结果、结果保留两位小数等功能。 2. 建立HTML页面 在确定好计算器的功能后,需要建立一…

    C 2023年5月22日
    00
  • GCC 编译c程序的方法及过程解析

    GCC 编译 C 程序的方法及过程解析 什么是 GCC GCC(GNU Compiler Collection)是一个开源的编译器集合,它能够将 C、C++、Objective-C、Fortran、Ada、Go 等语言编写的代码翻译成计算机能够理解的机器码。GCC 能够在多种平台和操作系统中运行,比如 Linux、Unix、Windows、macOS 等。 …

    C 2023年5月23日
    00
  • C语言实现班级学生管理系统

    C语言实现班级学生管理系统 概述 班级学生管理系统是一种常见的信息管理系统,可以用于管理学生的基本信息、成绩等。可以使用C语言来实现一个简单的班级学生管理系统。 实现步骤 定义学生结构体,包括学号、姓名、性别、年龄、成绩等信息 struct Student { int id; char name[50]; char gender[10]; int age; …

    C 2023年5月23日
    00
  • C++ const的各种用法详解

    C++ const的各种用法详解 1. const基本用法 在C++中,const关键字用于修饰变量或函数返回值,表示该变量或返回值是一个不可更改的常量。 定义一个const变量的语法形式如下: const 数据类型 变量名 = 初始值; 例如,定义一个const整型变量a,初始值为10: const int a = 10; 定义完后,a不能被再次修改。 函…

    C 2023年5月22日
    00
  • 使用devenv在命令行中编译项目的方法

    使用devenv在命令行中编译项目可以通过以下步骤完成: 打开命令提示符窗口(可通过Win + R打开运行对话框,输入“cmd”并按Enter键打开命令提示符窗口) 进入Visual Studio的公共工具目录。默认情况下,这个目录在%ProgramFiles(x86)%\Microsoft Visual Studio\版本号\公共7\Tools或%Prog…

    C 2023年5月23日
    00
  • C++语言基础 命名空间

    C++是一门支持命名空间的语言,命名空间是C++中避免命名冲突的一个重要方式。我们可以通过使用命名空间,把定义在不同范围内的标识符分开,从而保证程序中的标识符不会冲突。 在C++中,命名空间是用关键字“namespace”来定义,如下所示: namespace MyNamespace { // 声明和定义各种变量、函数、类等成员 } 这里的“MyNamesp…

    C 2023年5月23日
    00
  • Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    当在Visual Studio Code中运行程序时输出中文出现乱码问题,通常是由于命令行终端的默认字符集与程序输出字符集不一致导致的。下面就详细讲解解决此问题的步骤。 步骤一:查看当前终端默认字符集 运行以下命令查看当前终端默认字符集 chcp 下面是命令输出的结果: 活动代码页: 936 以上结果表示当前终端的默认字符集是“GB2312”。 步骤二:修改…

    C 2023年5月22日
    00
  • C/C++实操True and false详解

    C/C++实操True and false详解 本篇文章主要讲解C/C++中的True和False变量的含义和使用,以及相关操作符和示例说明。 True和False的含义 True和False是C/C++中的布尔类型变量,分别代表真(true)和假(false)。它们的值分别为1和0。在C/C++中,任何非0的值都会被视为True,而0则被视为False。 …

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