C++11中的Lambda表达式

文章目录

C++11中的Lambda表达式

1.lambda表达式形式

lambda表达式具有以下形式

capture list\] (parameter list) -\> return type {function body} 其中,\[capture list\] 是捕获列表,是一个lambda所在函数中定义的局部变量的列表,通常为空。return type、(parameter list)、{function body}和普通函数一样,分别表示返回类型、参数列表、函数体。但是和普通函数不同lambda必须尾置返回。 我们可以忽略参数列表和返回类型,但是必须永远包含捕获列表和函数体。 例如: ```c++ auto f = [] {return 42;} ``` 上述例子中,忽略参数列表,表示函数参数为空;忽略返回类型,则会根据函数体中的代码推断出返回类型。 ## 2.向lambda传递参数 和普通的函数类似,调用lambda时给定的实参被用来初始化lambda的形参,通常实参和形参的类型必须匹配。注意:lambda函数不能有默认参数。 例如: ```c++ [](const string& a,const string& b) {return a.size() < b.size();} ``` 空捕获列表表明lambda不使用它所在函数中的任何局部变量。 应用如下: ```c++ stable_sort(word.begin().word.end(),[](const string& a,const string& b){return a.size() < b.size();}); ``` 当stable_sort需要比较两个元素时,它就会调用给定的lambda表达式。 ## 3.使用捕获列表 虽然lambda可以出现在一个函数中,使用其局部变量,但是它只能使用那些明确指明的变量。一个lambda通过将局部变量包含在其捕获列表中来指出将会使用这些变量。 例如: ```c++ [sz](const string& a){return a.size() >= sz; } ``` lambda将捕获sz,函数体将string的大小与sz进行比较。 lambda以\[\] 开始,我们可以在其中添加以逗号分隔的名字列表,这些名字都是它所在函数中定义的。注意:一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量。 另外,一个lambda可以使用定义在函数之外的名字。例如: ```c++ for_each(wc,words.begin(),[](const string& s){cout<sz;}); ``` 如果我们希望对一部分变量采用值捕获方式,对其他变量采用引用捕获方式,可以混合使用隐式捕获和显示捕获。 例如: ```c++ // os隐式捕获,引用捕获方式;c显示捕获,值捕获方式 for_each(wc,words.begin(), [&,c](const string& s){os << s << c;}); // os显式捕获,引用捕获方式;c隐式捕获,值捕获方式 for_each(wc,words.begin(), [=,&os](const string& s){os << s << c;}); ``` 当我们混合使用隐式和显示捕获时,捕获列表的第一个元素必须是\&或=,此符号指定了默认捕获方式为引用或值。并且显示捕获的变量和隐式捕获的变量必须使用不同的捕获方式。 ### 4.可变lambda 默认情况下,对于值捕获lambda不会改变其值,如果我们希望改变一个被捕获变量的值,就必须在参数列表尾加上关键字mutable。例如: ```c++ void fun1 { size_t v1 = 42; // f可以改变她所捕获的变量的值 auto f = [v1]() mutable {return ++v1;}; v1 = 0; auto j = f(); // j的值为43 } ``` 另外,一个引用捕获的变量是否可以修改依赖于此引用指向的是const类型还是非const类型。例如: ```c++ void fun1 { size_t v1 = 42; // v1是一个非const变量的引用,可以通过f中的引用来改变它 auto f = [&v1]() {return ++v1;}; v1 = 0; auto j = f(); // j的值为1 } ``` ### 5.指定lambda的返回类型 一般情况下lambda返回为void,但是也有需要指定返回类型的时候。 注意:当我们需要为lambda定义返回类型时,必须使用尾置返回类型。例如: ```c++ tansform(v1.begin(),v1.end(),v1.begin(),[](int i) -> int {if(i < 0) return -i; else return i;}); ``` 好了,lambda表达式的介绍就到这里。以上所有内容均来自《C++ primer》第5版一书,更详细的内容,可以参考该书。

相关推荐
奕天者1 分钟前
C++学习笔记(三十三)——forward_list
c++·笔记·学习
麻芝汤圆16 分钟前
MapReduce 的广泛应用:从数据处理到智能决策
java·开发语言·前端·hadoop·后端·servlet·mapreduce
珊瑚里的鱼21 分钟前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
哈哈哈哈哈哈哈哈哈...........23 分钟前
【java】在 Java 中,获取一个类的`Class`对象有多种方式
java·开发语言·python
@小白向前冲28 分钟前
python 重要易忘 语言基础
开发语言·python
蹦蹦跳跳真可爱58930 分钟前
Python----计算机视觉处理(Opencv:道路检测之车道线拟合)
开发语言·人工智能·python·opencv·计算机视觉
6<734 分钟前
【go】空接口
开发语言·后端·golang
武昌库里写JAVA44 分钟前
Golang的消息中间件选型
java·开发语言·spring boot·学习·课程设计
染指11102 小时前
6.第二阶段x64游戏实战-分析人物状态
开发语言·汇编·windows·游戏·游戏逆向·x64dbg·x64游戏
forestsea2 小时前
Java虚拟机面试题:内存管理(中)
java·开发语言