C++ Lambda 表达式从入门到放弃

前言

总结记录自己学习并使用 C++ Lambda 表达式笔记。

Lambda 表达式概述

Lambda表达式是C++11新特性,用于创建匿名的函数对象,简化编程工作。

语法

[函数对象参数] (操作符重载函数参数)mutable或exception声明 ->返回类型{函数体}

其中返回值类型可隐式推导,void类型返回值可省略。
函数对象参数定义了Lambda如何访问作用域内的变量。

1. 函数对象参数

标示一个Lambda表达式的开始,必须存在,不能省略。函数参数对象只能使用那些定义 Lambda 所在作用范围内可见的局部变量(包含Lambda所在类的this)
a. []:没有任何函数参数对象
b. [=]:以值传递方式捕获Lambda所在范围内的所有局部变量。
c. [&]:以引用传递方法捕获Lambda所在范围内的所有局部变量。
d. this:函数体可以使用Lambda所在类的成员变量。
e. [x,&y]:x以值传递捕获,y以引用形式捕获。
f. [=,&z]:z以引用形式捕获,其他变量以值传递捕获。
g. [&,x]:x以值传递形式捕获,其他变量以引用形式捕获。

lambda要访问所在函数的局部变量时,必须先捕获。两种局部变量捕获方式:
值捕获:创建lambda表达式时,拷贝所在函数的局部变量的值。
引用捕获:创建lambda表达式时,获取变量的引用。需要确保lambda使用变量时,变量对应对象存在。
注:
1)值捕获是发生在lambda创建时,而非调用时。
2)lambda无法捕获任何static变量、全局变量,不过可以在lambda表达式内部直接访问。

#include <iostream>
using namespace std;

// 值捕获拷贝变量,发生在lambda创建时
void lambda_value()
{
    int v1 = 1024;
    auto a = [v1]()->int { return v1; }; // 值捕获v1 = 1024
    v1 = 0;
    auto b = a(); // lambda调用时,不会改变捕获值,因此b为1024
    cout<<b<<endl;
}

// 引用捕获获取变量引用
void lambda_reference()
{
    int v1 = 1024;
    auto a = [&v1]()->int { return v1; }; // 引用捕获v1
    v1 = 0;
    auto b = a(); // b为0
    cout<<b<<endl;
}

int main(int argc, const char * argv[])
{
    lambda_value();
    lambda_reference();
    return 0;
}

2. 操作符重载函数参数

参数列表,标识重载的()操作符,没有参数时,可以省略,但"()"不可用省略,类似于函数定义。参数可以使用值传递和引用传递。

3. mutable 或者 exception 声明

可以省略。函数参数按值传递时,加上mutable修饰后,可以修改传递进来的拷贝。exception声明用于指定函数抛出的异常,可以使用throw(int)。

void lambda_mutable()
{
    int v1 = 1023;
    auto f = [v1]() mutable { return ++v1; }; // 加上mutable才能修改值捕获的v1
    // <=> auto f = [v1]() mutable -> int { return ++v1; };
    v1 = 0;
    auto val = f(); // val 为1024
    cout<<val<<endl;
}

4. -> 返回值类型

标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方时,这部分可以省略,编译器自动推断返回类型。如果编译器无法推断lambda返回类型,就需要尾置返回类型,不可省略。

5. 函数体

标识函数的实现,不能省略,函数体可以为空。

简单例子

之前写过一篇 vector中pair的排序方法 的文章里面有用到 Lambda 表达式。
vector中pair的排序方法
下面同样给出一个类似的例子:

#include"iostream"
#include"vector"
#include"algorithm"
using namespace std;

static bool cmp(int &a, int &b)
{
	return a > b;
}

int main()
{
    vector<int> data;
    for(unsigned int i = 0; i < 10; i++) {
		data.push_back(i);
    }
	for(unsigned int i = 0; i < data.size(); ++i) {
        cout << data[i] << endl;
    }    
    //sort(data.begin(), data.end(), cmp);
	sort(data.begin(), data.end(), [](int &a,int &b)->bool { return a>b;});
    for_each(data.begin(), data.end(), [](int & d){ cout<<d<<endl;});
    return 0;
}

总结

熟能生巧, 多写多用。

参考网址

  1. cppreference.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C is a programming language that was originally developed in the 1970s by Dennis Ritchie at Bell Labs. It is a general-purpose, imperative programming language that is widely used for developing operating systems, system software, embedded systems, and other applications that require low-level access to hardware. C is a compiled language, meaning that code written in C is first translated into machine code by a compiler before being executed. This makes it a relatively fast language compared to interpreted languages like Python or JavaScript. C is known for its low-level features, including pointers and direct memory manipulation, which give developers fine-grained control over the behavior of their programs. This also means that C programs can be more prone to errors, such as buffer overflows or memory leaks, if not written carefully. C has influenced many other programming languages, including C++, Java, and Python. It remains a popular language for system programming, embedded systems, and other applications that require low-level control over hardware. ### 回答2: C 是计算机编程语言中的一种,它是一种通用的高级编程语言。C 语言由美国计算机科学家德尼斯·里奇在20世纪70年代开发出来,最初是为了编写操作系统UNIX而设计的。C 语言相对简单,但功能强大,可以用于开发各种软件和应用。 C 语言具有丰富的数据类型,如整数、浮点数、字符以及数组、结构等。它还有强大的控制结构,如条件语句、循环语句和跳转语句,使得程序的编写更加灵活。C 语言还支持函数的定义和调用,这样可以将程序分为多个模块,提高代码的可维护性。 C 语言的代码编写简洁,运行效率高,非常适合系统底层的开发。许多操作系统、编译器、数据库和嵌入式系统等都是用C语言编写的。C 语言也是很多编程新手的入门语言,因为它的学习曲线相对较低,但掌握 C 语言的基础知识对于学习其他编程语言非常有帮助。 C 语言是一种面向过程的语言,较为底层,需要程序员手动管理内存。为了降低内存管理的负担,后来又出现了C++语言,它是在 C 语言的基础上增加了面向对象的特性,使得编程更加高级和简化。但是,C 语言仍然被广泛使用,特别是在嵌入式系统、驱动程序和核心开发等领域。 总之,C 语言是一种重要的编程语言,具有简洁高效、灵活多样的特点,广泛应用于计算机科学和软件开发领域。掌握 C 语言可以为进一步学习其他编程语言打下良好的基础。 ### 回答3: C是计算机科学领域重要的编程语言之一,它由美国贝尔实验室的Dennis Ritchie开发。C语言于1972年首次发布,之后逐渐流行并成为了广泛应用的编程语言。C语言的设计目标是提供一种直接的、可移植的编程语言,用来开发高效的系统软件和应用程序。 C语言具有很多特点。首先,C语言是一种结构化的编程语言,它通过使用函数和块来组织代码,使程序的结构更加清晰和可读。其次,C语言具有丰富的运算符和表达式,可以进行复杂的数学运算和逻辑判断。另外,C语言具备高度的可移植性,可以在不同的硬件平台上编译和运行。 C语言还具有丰富的标准库函数,可以方便地实现诸如文件操作、字符串处理、内存管理等功能。此外,C语言还支持指针操作,允许直接访问和操作内存地址,提高程序的效率。 在计算机科学领域,C语言被广泛应用于系统软件的编写,如操作系统、编译器等。同时,C语言也是许多高级编程语言的基础,如C++、Java等,因此熟练掌握C语言将有助于学习和理解其他编程语言。 总而言之,C语言作为计算机科学领域的一种重要编程语言,具有结构化、高效、可移植的特点,被广泛应用于系统软件和应用程序的开发。对于学习和理解计算机科学的基本原理和概念来说,掌握C语言是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值