基本信息
文件名称:C++11中匿名函数lambda的使用详解.docx
文件大小:17.71 KB
总页数:6 页
更新时间:2025-05-21
总字数:约3.39千字
文档摘要

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

目录一、lambda基础介绍二、lambda使用例子2.1STL算法中的回调函数2.2回调函数2.3多线程编程三、总结官方介绍:

C++lambda是C++11新增的一种匿名函数的实现方式,可以在代码中直接定义一个函数对象。它的语法是通过关键字[]来定义的,括号里可以包含需要访问的外部变量。Lambda函数可以用于在STL算法中提供自定义的比较函数,或者作为std::function的参数。它的简洁和易用性使得在C++11中变得非常流行。

一、lambda基础介绍

Lambda表达式的完整声明格式如下:

[capturelist](parameterlist)mutableexception-

returntype{functionbody}

capturelist:用于捕获外部变量的列表,可以省略。parameterlist:函数参数列表,可以省略。mutable:可选项,用于指定能否修改捕获的变量。exception:可选项,用于指定能抛出的异常。returntype:可选项,用于指定返回值类型。如果省略,编译器会自动推断。functionbody:函数主体。

通常情况下,一个lambda表达式不需要如此多的关键词,更常用的声明形式如下,只需要captures、parameters、returntype、body即可:

[captures](parameters)-return_type{body}

有一些情况下,返回类型可以从return语句中推导(如auto),则返回类型可以省略。而当lambda表达式没有参数的时候,用于表示参数列表的括号也是可以省略的:

[captures]{body}

//也就是

具体的例子:

[](){}//定义一个没有参数和返回值的lambda表达式

[](inta,intb){returna+b;}//定义一个带有参数的lambda表达式

[x](inta){returnx*a;}//定义一个捕获x的lambda表达式

Lambda表达式还可以使用默认参数值,通过在参数后面使用=default_value来实现。

例如:

[](inta,intb=10){returna+b;}//定义一个带有默认参数值的lambda表达式

在捕获列表中,你可以使用或=来捕获外部变量。

使得lambda表达式可以修改捕获的变量。=使得lambda表达式不能修改捕获的变量(默认值)。

例如:

intx=10;

[x](){x++;}//定义一个可以修改x的lambda表达式

[=x](){x++;}//定义一个不能修改x的lambda表达式

Lambda表达式可以通过赋值给std::function对象或者直接调用来使用。

例如:

std::functionint(int,int)add=[](inta,intb){returna+b;};

intresult=add(1,2);

二、lambda使用例子

2.1STL算法中的回调函数

STL算法如sort,for_each等需要一个可调用的对象来完成操作,这时候lambda表达式可以提供一种简洁的方式来定义这个可调用的对象。

#includealgorithm

#includeiostream

#includevector

intmain()

std::vectorintv{3,1,4,1,5,9,2,6,5};

std::sort(v.begin(),v.end(),[](inta,intb){returna});

for(intx:v)

std::coutx;

std::coutstd::endl;

return0;

sort第三个参数可以传入一个函数,是因为sort使用了模板,第三个参数是一个比较函数,它是一个可以接受两个参数并返回一个bool值的函数。sort函数使用这个比较函数来确定如何排序序列中的元素。如果第三个参数省略,sort默认使用小于运算符进行比较。

可以使用std::lessint替换lambda表达式,如下所示:

std::sort(v.begin(),v.end(),std::lessint

或者你也可以定义一个比较函