C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。

lambda表达式的语法如下所示:
[capture_block](parameters) exceptions_specification -> return_type {body}

[捕捉块](参数) 异常 -> 返回值类型 {主体}

或者更直白地看如下:

这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
2. Lambda表达式的参数列表
3. Mutable 标识
4. 异常标识
5. 返回值类型
6.“函数”体,也就是lambda表达式需要进行的实际操作

下面的例子将逐步演示如何使用lambda表达式:

范例一:无参数的lambda表达式

[]{std::cout<<"Hello from Lambda!"<<std::endl;}();

or

[](){std::cout << "Hello from Lambda!" << std::endl; }();

输出如下所示:

Hello from Lambda
在控制台输出Hello from Lambda,尾部的括号使该表达式可立即执行。

范例二:带参数的lambda表达式

string str = [](const string& str)->string{return "Hello from " + str; }("second lambda");
cout << str << endl;

输出如下所示:

Hello from second Lambda
该lambda表达式接受一个string参数并返回一个string,结果保存在变量result中,尾部的括号使得该表达式立即执行。

范例三:像平常的调用函数一样使用lamdba表达式

 auto f = [](std::string str)->string{return "hello from " + str; };auto f2 = [](std::string str) {return "hello from " + str; };cout << f2("third lambda") << endl;

输出如下所示:

hello from third lambda

此处保存指向lambda表达式的指针,并且通过函数指针执行该表达式。

范例四:(STL与lambda)

#include <iostream>
#include <algorithm>
#include <vector>auto main(int argc, char** argv) -> int
{
std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9};
int value=3;
int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;});
std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;return 0;
}

输出如下所示:

Found 6 values > 3

通过count_if算法计算vector中满足特定条件的元素个数,lambda表达式的形式给出了条件,注意表达式中的=,等号表示通过值捕捉所在作用域的变量,这个例子中捕捉的是value的值。前面的例子[]为空,即捕捉块为空,那么在lambda表达式的主体body内就无法访问变量了。以下是关于捕捉块的详细介绍:

[=]   通过值捕捉所有变量
[&]  通过引用捕捉所有变量
[value] 通过值捕捉value,不捕捉其它变量
[&value] 通过引用捕捉value,不捕捉其它变量
[=, &value] 默认通过值捕捉,变量value例外,通过引用捕捉
[&, value] 默认通过引用捕捉,变量value例外,通过值捕捉

范例五:(STL与lambda结合)

#include <iostream>
#include <algorithm>
#include <vector>auto main(int argc, char** argv) -> int
{
std::vector<int> vec2 = { 11, 22, 33, 44 };
int index = 0;
for_each(vec2.begin(), vec2.end(), [index](int i){std::cout << "Value " << (index++) << ": " << i << std::endl; });
return 0;
}

注意:这里必须使用[&index],而不能使用[index],原因在于index++;否则会出现

错误提示:不能在非可变 lambda 中修改按值捕获

通过for_each算法可以对给定范围中的所有元素执行特定操作,调用lambda表达式,并将这个值作为参数传递给lambda表达式。

范例六:(多个参数)

int n = [](int x, int y) { return x + y; }(5, 4);cout << n << endl;

从以上示例来看,

1.如果我们想要提示返回的类型,就要加上->return_type {},否则,直接使用{}即可。

2.C++ 11的lamdba表达式来源于其它语言,像Python,也有lamdba表达式。如:lambda x: x * x

范例程序差不多了,在C++11中,官方似乎一直鼓励大家用lambda表达式,而不是函数对象,lambda表达式更易于使用和理解。

C++11系列学习之二-----lambda表达式相关推荐

  1. java 文件路径表达式_Java基础(二十二) Lambda表达式和File类

    函数式编程思想 强调的是做什么,而不是以什么样的方式来做,它忽略了面向对象的复杂语法,只要能够获取到结果,谁去做的,怎么做的,都不重要,重要的是结果,不重视过程. 冗余的Runnable代码 传统的写 ...

  2. Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface

    Jdk1.8新增lambda表达式是为了简化代码,主要用于简化匿名实现类,为其提供一种更加简洁的写法.Lambda表达式在swift语言中被称为代码块,lambda表达式可以认为是一种特殊的接口,是匿 ...

  3. C++11新特性之lambda表达式

    lambda表达式的特性 Lambda 表达式用于定义并创建匿名的函数对象,用于替代简单的函数. lambda表达式的示例代码 lambda表达式的格式为 [ capture ] ( params ) ...

  4. C++11 std::thread-使用lambda表达式-GCC 4.9编译通过

    #include <thread> #include <iostream>int main() {std::thread thread1([](){std::cout<& ...

  5. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...

  6. C++11 学习笔记 lambda表达式

    http://blog.csdn.net/fjzpdkf/article/details/50249287 lambda表达式是C++11最重要也最常用的一个特性之一.lambda来源于函数式编程的概 ...

  7. C++11——lambda表达式

    目录 前言 一.lambda表达式用法 二.lambda表达式语法 三.lambda表达式的原理 前言 在显示生活中,我们在用手机购物时.总是可以在页面上看到下面这样的选项. 我们知道底层这是通过排序 ...

  8. C++11中的Lambda表达式

    本文地址:http://www.cnblogs.com/archimedes/p/c11-lambda.html,转载请注明源地址. "Lambda 表达式"(lambda exp ...

  9. [C++11]lambda表达式语法

    代码如下: #include <iostream> using namespace std;void func(int x, int y) {int a;int b;[=]() {int ...

最新文章

  1. 承德计算机专业去哪考试,2021河北省考承德都在哪个学校考试?
  2. 查找算法:二分查找、顺序查找
  3. 【长篇连载】桌面管理演义 第六回 违规言论别乱发 访问控制把你抓
  4. idea java web运行_使用IDEA创建JavaWeb项目 部署本地tomcat并运行
  5. 基于Docker搭建RabbitMQ(多图)
  6. java 标准输入流 关闭 打开_java--标准输入输出流
  7. Matlab R2016a安装教程
  8. [译]Selenium —— 怎样使用FireBug和FirePath
  9. 基于边缘计算的KNX应用
  10. keil c51v952详细安装教程
  11. android最新系统排行,四大安卓系统排名,Flyme最好?
  12. 前端页面闪动(vue+ele 表格分页)
  13. 计算机上播放时没声音什么故障,电脑播放视频没有声音是什么原因
  14. 原生Python实现KNN算法,并用鸢尾花(iris)数据集测试
  15. 刘鹏教授在淮安市应急管理局作报告
  16. 五大地形等高线特征_七年级所有知识点
  17. 幽门螺旋杆菌反反复复,该怎么办?
  18. TabControl 选项卡控件
  19. 跟我学aspectj之四 ----- pointcut基础语法
  20. 上海亚商投顾:成交量不足万亿,指数止步四连阳

热门文章

  1. Tcpdump抓包工具的使用
  2. 3.GDScript(1)概览
  3. Yii框架中使用PHPExcel导出Excel文件
  4. 注意扩展方法的返回值类型
  5. STL - 底层实现
  6. hdu 4279 Number
  7. 仿微信朋友圈项目梳理
  8. springmvc 中文文档
  9. html--form表单常用操作
  10. Java zip解压,并遍历zip中的配置文件 .cfg或.properties