第
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
或者你也可以定义一个比较函