视觉SLAM十四讲读书笔记(1)P1-P9

目录

 

#include 是什么

头文件和库文件的区别

int main(int argc, char **argv)的含义

endl是什么

return 0

github

Q:线性方程Ax=b,若已知Ab,如何求解x,这对Ab有什么要求,可以从A的维度和秩来分析

mxn的矩阵,当m会怎样<>

Q:为什么A的秩和Ab的秩会不一样

高斯消元法

增广矩阵

LU分解法

QR(正交三角)分解法

Q:高斯分布是什么,他的一维形式是什么样子,他的高维形式是什么样子

什么是均值,什么是标准差

什么是协方差

什么是方差

什么是对称正定矩阵

什么是特征值

Q:什么是C++中的类

Q:什么是STL

public、private和protected

数据成员和成员函数

构造函数和析构函数

Q:什么是C++11标准,他有什么新特性,还有没有其他的标准

什么是Linux,什么是ubuntu

Linux的目录结构是怎样的

如何在ubuntu中安装软件。这些软件安装在什么地方。如果只知道模糊的软件名称该如何安装

什么是自动类型推断(auto关键字)

什么是范围for循环

移动语义和右值引用

Lambda表达式


#include <iostream>
using namespace std;

int main(int argc, char **argv) {
  cout << "Hello SLAM!" << endl;
  return 0;
}

#include <iostream>是什么

#include <iostream>这句话是C++中用来引入iostream库的预处理指令,iostream库包含了C++中输入和输出的基本操作,比如cout和cin。当程序中需要使用这些操作时,需要包含这个头文件。

#include 是C++中的一个预处理指令,用于包含头文件(header file)或库文件(library file)中的声明或定义。通常在C++程序的开头或所需使用的特定函数之前,使用 #include 来引入所需的头文件或库文件。这些文件通常包含一些函数或类的定义,以及其他需要在程序中使用的一些声明和定义。

"<iostream>" 是 C++ 标准库中的一个头文件,用于支持输入和输出操作。其中包含了 cout、cin 等用于控制台输出和输入的函数。在 C++ 中使用这个头文件可以让程序更加方便地进行输入输出操作。


头文件和库文件的区别

头文件(Header File)是C/C++中一种包含声明函数、变量、常量和结构体等信息的文件,通常以.h为文件后缀名。头文件中的声明可以被多个源文件包含,避免了重复的代码。例如,标准库中的头文件如iostream、cstdio等包含了对输入输出和文件操作等函数的声明。

库文件(Library File)是一些可重复使用的代码的集合,它们可以被多个程序共享,通常以.lib或.a为文件后缀名。库文件可以分为静态库和动态库两种类型。静态库在编译时链接到可执行文件中,程序运行时不需要外部库的支持;动态库在程序运行时动态链接,多个程序可以共享一个动态库。

区别在于头文件是包含了函数、变量、常量的声明信息,供编译器在编译时检查函数和变量的正确性。而库文件则是实际包含了函数和变量的二进制代码,编译器将其链接到可执行文件中,供程序运行时调用。头文件用于告诉编译器函数和变量的类型和名称,库文件则提供了函数和变量的实际实现。


int main(int argc, char **argv)的含义

int main(int argc, char **argv) 是C++程序的主函数。它接受两个参数: argcargv。其中, argc 是指传入 main 函数的参数个数,char **argv是一个指向指针的指针,用来存放传入 main 函数的参数。

一般情况下,argc 是 1,也就是只有程序本身的文件名一个参数。argv 数组中第一个元素是程序的名称,后面的元素是命令行参数,例如:

./my_program arg1 arg2 arg3

那么,argv 就会是一个包含四个元素的指针数组,其中 argv[0]./my_programargv[1]arg1argv[2]arg2argv[3]arg3

main 函数中,我们可以根据传入的参数个数和参数内容做出不同的操作。


endl是什么

endl 是一个 C++ 中的输出流控制符,用于在输出流中插入一个换行符并刷新输出缓冲区。与使用 \n 相比,使用 endl 可以确保输出被立即刷新,以便在需要时立即查看输出。例如:

std::cout << "Hello, world!" << std::endl;

这将在控制台上输出 "Hello, world!" 并在末尾插入一个换行符。同时,它还会强制输出缓冲区刷新,以确保我们立即看到输出结果。


return 0

return 0是C++中main函数的返回值,表示程序执行成功并正常退出。返回0是常见的惯例,但实际上,main函数返回的整数可以是任何值,通常非零值表示异常终止或错误代码。


github

GitHub是一个基于互联网的代码托管平台,也是全球最大的代码托管平台之一。它提供了一种方便的方式,让开发者可以将自己的代码存储在云端,并与其他开发者协作开发、共享代码。同时,GitHub也为开源社区和个人开发者提供了一个展示和推广自己项目的平台,可以帮助开发者更加便捷地分享代码和吸引更多的用户和贡献者。


Q:线性方程Ax=b,若已知Ab,如何求解x,这对Ab有什么要求,可以从A的维度和秩来分析

A:对于线性方程Ax=b,若已知Ab,可以通过矩阵求解方法求解x。在求解过程中,对Ab的要求主要有以下两个方面:

  1. 要求A的维度和秩:
  • 矩阵A的行数必须大于等于列数,即m >= n,这是因为在方程组Ax=b中,A是一个m行n列的矩阵,b是一个m行1列的矩阵,x是一个n行1列的矩阵,当m < n时,方程组的个数小于未知数的个数,此时方程组无解或有无穷多解,不能求解。
  • 矩阵A的秩必须等于n,即rank(A) = n,这是因为如果矩阵A的秩小于n,即rank(A) < n,那么方程组Ax=b的解将不存在或不唯一,不能求解。
  1. 要求Ab满足条件:
  • 矩阵Ab中,b是一个m行1列的列向量,列向量b的维数必须等于矩阵A的行数,即b的长度必须等于m。
  • 矩阵Ab的秩必须等于矩阵A的秩,即rank(Ab) = rank(A),这是因为矩阵Ab与A等价,如果Ab的秩小于A的秩,那么它们的解将不存在或不唯一,不能求解。

如果Ab满足以上两个要求,则可以通过矩阵求解方法求解x。其中,最常用的矩阵求解方法包括高斯消元法、LU分解法、QR分解法等。


mxn的矩阵,当m<n会怎样

当m<n时,方程组的个数小于未知数的个数,此时可能出现以下情况:

  1. 当A的秩等于Ab的秩时,方程组有解且解唯一;
  2. 当A的秩小于Ab的秩时,方程组无解;
  3. 当A的秩等于n,且Ab的秩小于n时,方程组有无穷多个解。

Q:为什么A的秩和Ab的秩会不一样

A:如果 A的秩为 r,则代表 A的列向量中最多有 r个线性无关的向量。而 Ab 的秩可以比 A的秩小,也可以相等。这是因为 b 向量的加入可能使得原本线性无关的向量变得线性相关。

假设A是一个m*n的矩阵,b是一个n*1的列向量,A的秩为r_A,则A的列空间维数为r_A,A*b的秩最大为r_A。

当b在A的列空间内时,Ab的秩与A的列空间维数相等,即为r_A;当b不在A的列空间内时,Ab的秩最大为r_A,但是无法达到r_A,因为Ab的列空间被A的列空间所限制。因此,Ab的秩一定小于等于r_A。

总结来说,A的秩和Ab的秩不一定相等,Ab的秩最大为A的秩。

对于任意矩阵A和矩阵B,它们的乘积AB的秩不会大于矩阵A和矩阵B的秩的较小值,即rank(AB) <= min(rank(A), rank(B))。因此,A的秩大于AB的秩。同时,如果AB的秩小于A的秩,这意味着A和B不是独立的,它们的乘积不包含所有的行空间和列空间,这会导致方程组可能无解或者有无穷多解。


高斯消元法

高斯消元法是一种求解线性方程组的常用方法,它的基本思想是通过一系列初等变换,将系数矩阵转化为一个上三角矩阵,然后通过回带法求解出方程组的解。

具体来说,高斯消元法分为三个步骤:

  1. 将系数矩阵和常数向量合并为一个增广矩阵。
  2. 通过一系列初等行变换,将增广矩阵化为行最简形式,即将系数矩阵转化为上三角矩阵。
  3. 通过回带法求解出方程组的解。

初等行变换包括三种操作:

  1. 交换矩阵的两行。
  2. 将矩阵的某一行乘以一个非零常数。
  3. 将矩阵的某一行加上另一行的若干倍。

通过这些操作,可以将系数矩阵转化为上三角矩阵。回带法是指从最后一行开始,逐个求解方程,一直到求解出所有未知数的值。

需要注意的是,如果矩阵的某一行全为零,需要交换该行和其下面的某一行,否则会出现除以零的情况,导致计算错误。

高斯消元法是一种比较常用的求解线性方程组的方法,但是当矩阵的行数和列数较大时,它的计算复杂度会比较高,效率也会比较低,因此在实际应用中需要综合考虑使用其他求解方法。


增广矩阵

增广矩阵是将一个方程组的系数矩阵和常数向量拼接在一起所形成的矩阵。它通常用来表示线性方程组,并且是进行高斯消元法的基础。对于一个n元线性方程组Ax=b,其增广矩阵可以表示为:

其中,左侧的矩阵是线性方程组的系数矩阵A,右侧的列向量则是常数向量b。在进行高斯消元法的过程中,我们通常会对增广矩阵进行变换,以求解线性方程组的解。


LU分解法

LU分解法是一种线性方程组求解方法,其基本思想是将系数矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。通过LU分解,将原问题转化为求解两个三角线性方程组Ly=b和Ux=y,这样求解过程可以简化。

具体实现步骤如下:

  1. 对A进行LU分解,得到L和U两个矩阵。其中,L是下三角矩阵,对角线元素为1,U是上三角矩阵。

  2. 将原始方程组Ax=b转化为LUx=b,令y=Ux,则Ly=b。

  3. 先求解Ly=b,再求解Ux=y,即可得到方程组的解x。

需要注意的是,对于某些特殊的矩阵,LU分解可能不存在或不唯一。此外,LU分解法的计算量较大,对于较大的矩阵需要进行优化。


QR(正交三角)分解法

QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。


Q:高斯分布是什么,他的一维形式是什么样子,他的高维形式是什么样子

A:高斯分布,也称正态分布,是一种常见的概率分布,它在自然界和社会现象中都有广泛应用。在统计学、概率论、物理学、工程学等领域都有着重要的应用。

一维高斯分布的概率密度函数为:

 其中,mu是均值,sigma 是标准差。

多维高斯分布可以用向量 x来表示,其概率密度函数为:

其中,mu是多维高斯分布的均值向量,sigma是多维高斯分布的协方差矩阵,d是向量的维度,|sigma|是协方差矩阵的行列式。

需要注意的是,多维高斯分布需要满足协方差矩阵是对称正定矩阵的条件。如果协方差矩阵不满足这个条件,就不是一个合法的高斯分布。


什么是均值,什么是标准差

均值是指一组数据中所有数值的平均数,通常用符号μ表示。计算均值的方法是将一组数据中的所有数值相加,然后除以数据的总数。

标准差是衡量一组数据的离散程度的一种方法。标准差的计算方法是先计算出每个数据点与均值之差的平方,然后将这些平方值相加,求出平均值,最后将平均值的平方根作为标准差。标准差的值越大,表示这组数据的离散程度越高,反之则越低。标准差常用符号σ表示。


什么是协方差

协方差是描述两个随机变量之间关系的一种统计量。如果两个随机变量的取值相互独立,则它们之间的协方差为0,反之,协方差值越大(正或负),说明两个随机变量之间的关系越密切。

对于两个随机变量X和Y,其协方差定义为:

cov(X,Y)=E[(X−μX)(Y−μX)]cov(X,Y)=E[(X−μX​)(Y−μY​)]

其中E表示求期望,μX和μX分别是X和Y的期望值。协方差值的正负号表示两个随机变量之间的关系,当两个随机变量呈现正相关关系时,协方差为正;当两个随机变量呈现负相关关系时,协方差为负;当两个随机变量没有关系时,协方差为0。

协方差矩阵是由多个随机变量的协方差构成的矩阵。对于n个随机变量X1,X2,...,Xn,其协方差矩阵C的元素为:

Ci,j=cov(Xi,Xj)

协方差矩阵是对称矩阵,对角线上的元素是各个随机变量的方差。协方差矩阵的特征值和特征向量在许多机器学习算法中都有着重要的应用,比如主成分分析(PCA)和线性判别分析(LDA)。


什么是方差

方差是用来描述数据分散程度的一种统计量。具体来说,对于一组数据,方差是每个数据值与全体数据平均数之差的平方值的平均数。方差越大,表示数据的分散程度越大;方差越小,表示数据的分散程度越小。


什么是对称正定矩阵

正定矩阵是指所有特征值均为正数的方阵。一个对称正定矩阵是指一个对称矩阵,其所有特征值均为正数。对称正定矩阵在数学和工程领域中都有广泛的应用,因为它们在各种计算中有很好的性质,如更容易求逆矩阵、更容易求解线性方程组等。


什么是特征值

在线性代数中,对于一个n阶方阵A,如果存在一个标量λ和一个n维非零向量v,使得下面的式子成立:

Av = λv

则称λ是A的特征值,v是对应于特征值λ的特征向量。特征向量在方向上保持不变,只是在长度上缩放。

特征值和特征向量在很多数学和工程领域都有广泛的应用,比如在机器学习中,可以用于主成分分析(PCA)和线性判别分析(LDA)等算法中。


Q:什么是C++中的类

A:在C++中,类是一种用于封装数据和函数的机制,是面向对象编程的基本概念。类可以看作是一个模板,定义了一种数据类型,其中包含了数据成员和成员函数。数据成员是类的属性,而成员函数是类的方法,可以访问和修改类的数据成员。

类的定义通常包含在一个头文件中,并通过包含该头文件来使用类。在使用类之前,必须先定义类的对象。通过使用类的对象,可以调用类的成员函数来实现对类的操作。类也可以包含构造函数和析构函数,用于对象的初始化和清理。

在C++中,类还可以继承其他类的成员,通过继承实现代码复用和扩展。此外,C++还支持访问控制修饰符,包括public、private和protected,用于限制成员的访问范围。

总之,C++中的类是一种强大的机制,可以用于实现面向对象编程的各种概念,如封装、继承和多态。


Q:什么是STL

A:STL(Standard Template Library,标准模板库)是C++标准库的一部分,包含了许多常用的数据结构和算法。STL的设计目标是提供一套高效、可靠、通用的C++程序库,它以模板为基础,使得数据结构和算法可以与具体的数据类型无关,实现了数据结构和算法的复用。STL包含了容器(vector、list、deque等)、迭代器、算法、函数对象、适配器等多种组件,可以大大提高C++程序的开发效率和代码的可读性。

STL的设计中使用了很多模板元编程的思想,使得STL中的组件可以根据不同的需求进行组合,从而实现高度的灵活性。由于STL的标准库被广泛使用,所以学习STL对于提高C++编程能力和实践经验都有很大的帮助。


public、private和protected

在C++类中,public、private和protected是用来控制成员访问权限的访问修饰符。

public表示该成员可以被任何函数访问,包括类外的函数。

private表示该成员只能被该类内部的函数访问,不能被类外的函数访问。

protected表示该成员可以被该类内部的函数和该类的派生类中的函数访问,但不能被类外的函数访问。

这些访问修饰符用于保护类的数据成员和成员函数,以防止其他代码直接访问和修改它们,从而保证了类的封装性。


数据成员和成员函数

在C++中,一个类由数据成员和成员函数组成。数据成员是类的属性或状态,用于描述对象的状态信息;成员函数是类的行为或操作,用于操作或处理类的数据成员。

数据成员可以分为两种类型:公有的(public)和私有的(private)。公有的数据成员可以在类的外部访问和修改,而私有的数据成员只能在类的成员函数中访问和修改。通常情况下,我们会将数据成员设置为私有的,然后通过公有的成员函数来实现对私有数据成员的访问和修改,这种方式可以提高类的封装性和安全性。

成员函数也可以分为两种类型:公有的(public)和私有的(private)。公有的成员函数可以在类的外部调用,而私有的成员函数只能在类的成员函数中调用。成员函数通常用于操作数据成员,实现类的功能和行为。通过成员函数,我们可以访问和修改数据成员,以及执行其他操作。

除了公有和私有的成员之外,还有一种受保护的成员函数(protected),它只能在当前类和派生类中访问。受保护的成员通常用于实现继承和多态性。


构造函数和析构函数

构造函数(Constructor)是一种特殊的成员函数,用于在对象创建时初始化对象的成员变量。它们的名称与类名相同,没有返回类型,并且可以有多个重载形式,以便根据需要使用不同的参数列表创建对象。

析构函数(Destructor)也是一种特殊的成员函数,用于在对象被销毁时释放对象使用的资源。它们的名称是类名前加上波浪号“~”,没有参数和返回类型。析构函数通常用于释放由构造函数分配的内存或关闭由构造函数打开的文件或连接。

在C++中,当对象被创建时,它的构造函数被自动调用,当对象被销毁时,它的析构函数被自动调用。因此,构造函数和析构函数的作用非常重要,它们可以确保对象在创建和销毁时处于正确的状态。


Q:什么是C++11标准,他有什么新特性,还有没有其他的标准

A:

C++11是C++语言的第一个正式标准,于2011年发布。它引入了许多新特性和改进,使得C++更加现代化、安全、高效。

一些C++11的新特性包括:

  • 自动类型推断(auto关键字)
  • 范围for循环
  • 移动语义和右值引用
  • lambda表达式
  • 新的智能指针类型(unique_ptr, shared_ptr等)
  • 多线程支持(std::thread, std::mutex等)
  • 初始值列表
  • constexpr关键字

除了C++11,还有C++14、C++17、C++20等后续标准,每个标准都引入了一些新特性和改进。其中C++14主要是对C++11的扩展,C++17引入了一些新特性,如结构化绑定和if语句中的初始化,而C++20又引入了一些新特性,如概念(Concepts)和三元操作符的重载等。


什么是Linux,什么是ubuntu

Linux是一种开源操作系统内核,其开发由芬兰计算机科学家Linus Torvalds在1991年开始,目前已经成为了世界上最流行的操作系统之一。Linux的特点包括稳定、高效、安全、可定制性强等,因此在服务器、嵌入式设备、超级计算机等领域得到了广泛应用。

Ubuntu是基于Linux内核的一款操作系统,也是目前最受欢迎的Linux发行版之一。Ubuntu由英国的Canonical公司进行开发和维护,致力于提供一个稳定、易用的操作系统,因此广受欢迎。Ubuntu支持多种桌面环境,包括GNOME、KDE、XFCE等,也支持多种架构,如x86、ARM等。


Linux的目录结构是怎样的

Linux系统的目录结构是一个树形结构,它的根目录为“/”,称为根目录(root directory),所有的目录和文件都是从根目录开始,一直向下延伸的。

以下是Linux常见的目录及其作用:

  • /bin:二进制文件存放目录,包含许多常用命令,如ls、cp、mv、cat等。
  • /sbin:系统二进制文件存放目录,存放一些只有管理员才能使用的系统命令,如iptables、ifconfig等。
  • /usr:用户程序目录,包含用户使用的应用程序和文件,如/usr/bin、/usr/lib等。
  • /etc:配置文件存放目录,存放系统的各种配置文件,如网络配置、用户配置等。
  • /home:用户主目录存放目录,每个用户在该目录下都有一个以用户名命名的目录,用于存放用户的文件和配置信息。
  • /var:变量文件目录,包含系统运行时需要改变数据的文件,如日志文件、缓存文件等。
  • /dev:设备文件存放目录,Linux将所有硬件都看作是文件,这些文件包括硬盘、键盘、鼠标等设备。
  • /tmp:临时文件目录,存放一些临时文件,当系统重启时,这些文件将被清空。
  • /proc:虚拟文件系统目录,存放当前正在运行的进程和内核的相关信息。
  • /root:超级管理员(root)主目录。
  • /boot:系统启动目录,存放系统启动相关的文件,如内核文件和启动菜单文件等。

这些目录是Linux系统中最基本、最重要的目录,对于系统的正常运行和管理都是至关重要的。


如何在ubuntu中安装软件。这些软件安装在什么地方。如果只知道模糊的软件名称该如何安装

在Ubuntu中安装软件有多种方法,最常见的是使用apt命令行工具:

  1. 打开终端(Terminal),使用sudo命令获取管理员权限。

  2. 更新软件源列表:sudo apt update

  3. 安装软件:sudo apt install 软件名称

安装的软件通常位于系统的标准目录下,如可执行文件位于/usr/bin、库文件位于/usr/lib等。

如果只知道模糊的软件名称,可以使用apt-cache搜索命令来查找软件包:

  1. 打开终端,使用sudo命令获取管理员权限。

  2. 搜索软件包:apt-cache search 软件名称

  3. 找到所需软件包后,使用apt命令进行安装。

除了使用apt命令外,还可以通过下载源代码编译安装软件,或使用其他包管理工具如snap等安装软件。


什么是自动类型推断(auto关键字)

自动类型推断是C++11引入的一个关键字auto。它可以让编译器根据变量的初始化表达式自动推断出变量的类型,而无需显式地指定类型。

使用auto关键字可以简化代码,减少类型定义的冗余,同时也能避免因类型定义不当而引入的错误。在编译时,编译器会根据变量的初始化表达式来推断变量的类型,从而确保变量的类型与初始化表达式的类型相同。

例如,下面的代码使用了auto关键字来推断变量的类型:

auto x = 1;  // x的类型被推断为int
auto y = 3.14;  // y的类型被推断为double
auto z = "hello";  // z的类型被推断为const char*

需要注意的是,使用auto关键字进行类型推断时,初始化表达式的类型必须是明确的,否则会导致编译错误。此外,auto关键字只能用于自动类型推断,不能用于定义函数的返回类型等其他用途。


什么是范围for循环

范围for循环(Range-based for loop)是C++11中引入的一种新的循环语句,用于遍历容器中的元素。它提供了一种更加简洁、易于理解的方式来遍历容器,减少了代码中的冗余代码和出错的可能性。

范围for循环语法如下:

for (element_declaration : container) {
    // 循环体
}

其中,element_declaration 是一个定义变量的语句,用于指定遍历容器时使用的变量名和类型。container 是需要遍历的容器,可以是数组、vector、list、map等STL容器。

范围for循环会自动遍历容器中的所有元素,并将每个元素赋值给变量 element_declaration,直到容器中的所有元素都被遍历完成。

例如,下面的代码使用范围for循环遍历了一个整型数组:

int arr[] = {1, 2, 3, 4, 5};
for (int x : arr) {
    std::cout << x << " ";
}

输出结果为:1 2 3 4 5

范围for循环还支持使用 auto 关键字进行类型推导,例如:

vector<int> vec = {1, 2, 3, 4, 5};
for (auto x : vec) {
    std::cout << x << " ";
}

输出结果同样为:1 2 3 4 5

第一行代码定义了一个名为vec的vector<int>类型的变量,并初始化为{1, 2, 3, 4, 5}。vector是C++标准库中的一个动态数组容器,int是存储的元素类型。在这个例子中,vec中包含5个int类型的元素,分别为1、2、3、4、5。


移动语义和右值引用

移动语义和右值引用是 C++11 引入的一种新特性,主要用于解决临时对象和资源管理的问题。

在 C++ 中,对象的值和对象本身是分离的。在使用函数返回值、函数参数传递或对象赋值时,都会进行一次复制操作,这个过程包括了内存的分配和数据的拷贝。对于一些大型对象或需要频繁进行内存分配和拷贝的对象,这些操作会带来很大的性能损失。

右值引用的提出,解决了这个问题。右值引用是一种新的引用类型,通过 && 符号表示,可以绑定到一个临时对象或即将销毁的对象上。与传统的左值引用不同,右值引用的引用对象在语义上是一个“右值”,即一个临时对象或即将销毁的对象,可以用于实现对象的移动操作,从而避免进行大量的内存分配和拷贝操作。

移动语义是在右值引用的基础上实现的,它是一种新的对象复制方式,用于将一个对象的内容从一个对象移动到另一个对象中,而不是进行一次拷贝。移动操作通常比拷贝操作更高效,尤其是对于大型对象或需要频繁进行内存分配和拷贝的对象。

在 C++11 中,标准库中的容器和算法也引入了对移动语义和右值引用的支持,可以直接使用 std::move() 函数实现对象的移动操作,从而提高程序的性能。


Lambda表达式

Lambda表达式是C++11引入的一种函数对象,它能够将一个函数作为参数传递给另一个函数,从而使代码更加简洁,易读性更好。

Lambda表达式的基本形式如下:

[capture-list](params-list) mutable exception-> return-type{ body }

其中,capture-list表示捕获列表,可以用来捕获外部的变量;params-list表示参数列表;mutable关键字用于指定Lambda表达式内部是否可变;exception用于指定异常类型;return-type表示返回值类型;body表示Lambda表达式的函数体。

例如,下面的代码使用Lambda表达式对一个vector进行排序:

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

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

Lambda表达式[](int a, int b){ return a < b; }用于指定排序的规则,它返回true表示a应该排在b的前面。

Lambda表达式还可以通过捕获列表捕获外部的变量,例如:

#include <iostream>

int main()
{
    int x = 10;
    auto f = [&x](int a){ return a + x; };
    std::cout << f(5) << std::endl;
    return 0;
}

Lambda表达式[&x](int a){ return a + x; }捕获了外部的变量x,并在函数体中使用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值