本文演示怎样在你的程序中使用 lambda 表达式。 有关
lambda 表达式的概述。请參阅 C++ 中的 Lambda 表达式

有关
lambda 表达式结构的具体信息,请參阅 Lambda 表达式语法

演示样例
1

因为 lambda 表达式已类型化,所以你能够将其指派给 auto 变量或 function 对象。例如以下所看到的:

代码

 
// declaring_lambda_expressions1.cpp
// compile with: /EHsc /W4
#include <functional>
#include <iostream> int main()
{ using namespace std; // Assign the lambda expression that adds two numbers to an auto variable.
auto f1 = [](int x, int y) { return x + y; }; cout << f1(2, 3) << endl; // Assign the same lambda expression to a function object.
function<int(int, int)> f2 = [](int x, int y) { return x + y; }; cout << f2(3, 4) << endl;
}

输出

              <span id="mt5" class="sentence" data-guid="00b907fd343e9d626276b5e4eac3d68a" data-source="" 5"="" style="margin: 0px; padding: 0px;">5
7

备注

有关具体信息。请參阅 自己主动
(C++
function 类函数调用
(C++)

尽管 lambda 表达式多在函数的主体中声明,可是能够在初始化变量的不论什么地方声明。

演示样例
2

Visual C++ 编译器将在声明而非调用 lambda 表达式时,将表达式绑定到捕获的变量。

下面演示样例显示一个通过值捕获局部变量 i 并通过引用捕获局部变量 j 的
lambda 表达式。

因为 lambda 表达式通过值捕获 i。因此在程序后面部分中又一次指派 i 不影响该表达式的结果。 可是,因为
lambda 表达式通过引用捕获 j,因此又一次指派 j 会影响该表达式的结果。

代码

 
// declaring_lambda_expressions2.cpp
// compile with: /EHsc /W4
#include <functional>
#include <iostream> int main()
{
using namespace std; int i = 3;
int j = 5; // The following lambda expression captures i by value and
// j by reference.
function<int (void)> f = [i, &j] { return i + j; }; // Change the values of i and j.
i = 22;
j = 44; // Call f and print its result.
cout << f() << endl;
}

输出

你能够马上调用 lambda 表达式,如以下的代码片段所看到的。 第二个代码片段演示怎样将
lambda 作为參数传递给标准模板库 (STL) 算法。比如 find_if。

演示样例
1

下面演示样例声明的 lambda 表达式将返回两个整数的总和并使用參数 5 和 4 马上调用该表达式:

代码

 
// calling_lambda_expressions1.cpp
// compile with: /EHsc
#include <iostream> int main()
{
using namespace std;
int n = [] (int x, int y) { return x + y; }(5, 4);
cout << n << endl;
}

输出

              9
            

演示样例
2

下面演示样例将 lambda 表达式作为參数传递给 find_if 函数。 假设
lambda 表达式的參数是偶数。则返回 true。

代码

 
// calling_lambda_expressions2.cpp
// compile with: /EHsc /W4
#include <list>
#include <algorithm>
#include <iostream> int main()
{
using namespace std; // Create a list of integers with a few initial elements.
list<int> numbers;
numbers.push_back(13);
numbers.push_back(17);
numbers.push_back(42);
numbers.push_back(46);
numbers.push_back(99); // Use the find_if function and a lambda expression to find the
// first even number in the list.
const list<int>::const_iterator result =
find_if(numbers.begin(), numbers.end(),[](int n) { return (n % 2) == 0; }); // Print the result.
if (result != numbers.end()) {
cout << "The first even number in the list is " << *result << "." << endl;
} else {
cout << "The list contains no even numbers." << endl;
}
}

输出

              列表中的第一个偶数是 42。

备注

有关 find_if 函数的具体信息,请參阅 find_if。 有关运行公共算法的
STL 函数的具体信息,请參阅 <algorithm>

[转到页首]

演示样例

你能够将 lambda 表达式嵌套在还有一个中,例如以下例所看到的。 内部
lambda 表达式将其參数与 2 相乘并返回结果。 外部 lambda 表达式通过其參数调用内部 lambda 表达式并在结果上加 3。

代码

 
// nesting_lambda_expressions.cpp
// compile with: /EHsc /W4
#include <iostream> int main()
{
using namespace std; // The following lambda expression contains a nested lambda
// expression.
int timestwoplusthree = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5); // Print the result.
cout << timestwoplusthree << endl;
}

输出

              13
            

备注

在该演示样例中。[](int y) { return
y * 2; } 是嵌套的 lambda 表达式。

[转到页首]

演示样例

很多编程语言都支持高阶函数的概念。

高阶函数是採用还有一个 lambda 表达式作为其參数或返回 lambda 表达式的 lambda 表达式。

你能够使用 function 类,使得
C++ lambda 表达式具有类似高阶函数的行为。 下面演示样例显示返回 function 对象的 lambda 表达式和採用 function 对象作为其參数的 lambda 表达式。

代码

 
// higher_order_lambda_expression.cpp
// compile with: /EHsc /W4
#include <iostream>
#include <functional> int main()
{
using namespace std; // The following code declares a lambda expression that returns
// another lambda expression that adds two numbers.
// The returned lambda expression captures parameter x by value.
auto addtwointegers = [](int x) -> function<int(int)> {
return [=](int y) { return x + y; };
}; // The following code declares a lambda expression that takes another
// lambda expression as its argument.
// The lambda expression applies the argument z to the function f
// and multiplies by 2.
auto higherorder = [](const function<int(int)>& f, int z) {
return f(z) * 2;
}; // Call the lambda expression that is bound to higherorder.
auto answer = higherorder(addtwointegers(7), 8); // Print the result, which is (7+8)*2.
cout << answer << endl;
}

输出

演示样例

你能够在函数的主体中使用 lambda 表达式。 lambda
表达式能够訪问该封闭函数可訪问的不论什么函数或数据成员。 你能够显式或隐式捕获 this 指针,以提供对封闭类的函数和数据成员的訪问路径。

你能够在函数中显式使用 this 指针。例如以下所看到的:

 
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[this](int n) { cout << n * _scale << endl; });
}

你也能够隐式捕获 this 指针:

 
 
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[=](int n) { cout << n * _scale << endl; });
}

下面演示样例显示封装小数位数值的 Scale 类。

 
// function_lambda_expression.cpp
// compile with: /EHsc /W4
#include <algorithm>
#include <iostream>
#include <vector> using namespace std; class Scale
{
public:
// The constructor.
explicit Scale(int scale) : _scale(scale) {} // Prints the product of each element in a vector object
// and the scale value to the console.
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(), [=](int n) { cout << n * _scale << endl; });
} private:
int _scale;
}; int main()
{
vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4); // Create a Scale object that scales elements by 3 and apply
// it to the vector object. Does not modify the vector.
Scale s(3);
s.ApplyScale(values);
}

输出

              <span id="mt41" class="sentence" data-guid="099d61fcf3211e322f2ad2aec4bc821f" data-source="" 3"="" style="margin: 0px; padding: 0px;">3
6
9
12

备注

ApplyScale 函数使用 lambda
表达式打印小数位数值与 vector 对象中的每一个元素的乘积。 lambda 表达式隐式捕获 this 指针,以便訪问 _scale 成员。

[转到页首]

演示样例

因为 lambda 表达式已类型化。因此你能够将其与 C++ 模板一起使用。 以下的演示样例显示 negate_all 和 print_all 函数。

negate_all 函数将一元 operator- 应用于 vector对象中的每一个元素。 print_all 函数将 vector 对象中的每一个元素打印到控制台。

代码

 
// template_lambda_expression.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream> using namespace std; // Negates each element in the vector object. Assumes signed data type.
template <typename T>
void negate_all(vector<T>& v)
{
for_each(v.begin(), v.end(), [](T& n) { n = -n; });
} // Prints to the console each element in the vector object.
template <typename T>
void print_all(const vector<T>& v)
{
for_each(v.begin(), v.end(), [](const T& n) { cout << n << endl; });
} int main()
{
// Create a vector of signed integers with a few elements.
vector<int> v;
v.push_back(34);
v.push_back(-43);
v.push_back(56); print_all(v);
negate_all(v);
cout << "After negate_all():" << endl;
print_all(v);
}

输出

              <span id="mt49" class="sentence" data-guid="e75e27c52a6284dad516bc98a31bfe72" data-source="" 34"="" style="margin: 0px; padding: 0px;">34
-43
56
After negate_all():
-34
43
-56

备注

有关 C++ 模板的具体信息,请參阅模板

[转到页首]

演示样例

lambda 表达式的主体遵循结构化异常处理 (SEH) 和 C++ 异常处理的原则。 你能够在
lambda 表达式主体中处理引发的异常或将异常处理推迟至封闭范围。

下面演示样例使用for_each 函数和 lambda 表达式将一个 vector 对象的值填充到还有一个中。

它使用 try/catch 块处理对第一个矢量的无效訪问。

代码

 
// eh_lambda_expression.cpp
// compile with: /EHsc /W4
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std; int main()
{
// Create a vector that contains 3 elements.
vector<int> elements(3); // Create another vector that contains index values.
vector<int> indices(3);
indices[0] = 0;
indices[1] = -1; // This is not a valid subscript. It will trigger an exception.
indices[2] = 2; // Use the values from the vector of index values to
// fill the elements vector. This example uses a
// try/catch block to handle invalid access to the
// elements vector.
try
{
for_each(indices.begin(), indices.end(), [&](int index) {
elements.at(index) = index;
});
}
catch (const out_of_range& e)
{
cerr << "Caught '" << e.what() << "'." << endl;
};
}

输出

              Caught 'invalid vector<T> subscript'.
            

备注

有关异常处理的具体信息,请參阅 Visual
C++ 中的异常处理

[转到页首]

演示样例

lambda 表达式的捕获子句不能包括具有托管类型的变量。 可是。你能够将具有托管类型的实际參数传递到
lambda 表达式的形式參数列表。

下面演示样例包括一个 lambda 表达式,它通过值捕获局部非托管变量 ch,并採用 System.String 对象作为其參数。

代码

 
// managed_lambda_expression.cpp
// compile with: /clr
using namespace System; int main()
{
char ch = '!'; // a local unmanaged variable // The following lambda expression captures local variables
// by value and takes a managed String object as its parameter.
[=](String ^s) {
Console::WriteLine(s + Convert::ToChar(ch));
}("Hello");
}

输出

              Hello!
            

备注


Lambda 表达式的演示样例-来源(MSDN)的更多相关文章

  1. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

  2. Java 8 时间日期库的20个使用演示样例

    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日 ...

  3. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  4. Tiny并行计算框架之复杂演示样例

    问题来源  很感谢@doctorwho的问题: 假如职业介绍所来了一批生产汽车的工作,如果生产一辆汽车任务是这种:搭好底盘.拧4个轮胎.安装发动机.安装4个座椅.再装4个车门.最后安装顶棚. 之间有的 ...

  5. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  6. C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例

    C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例 Unity中循环遍历每一个数据,并做出推断 非常多时候.游戏在玩家做出推断以后.游戏程序会遍历玩家身上大量的所需数据,然后做出推断. ...

  7. [Python] SQLBuilder 演示样例代码

    用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...

  8. PHPCMS中GET标签概述、 get 标签语法、get 标签创建工具、get 调用本系统演示样例、get 调用其它系统演示样例

    一.get 标签概述 通俗来讲,get 标签是Phpcms定义的能直接调用数据库里面内容的简单化.友好化代码,她可调用本系统和外部数据,仅仅有你对SQL有一定的了解,她就是你的绝世好剑!也就是适合熟悉 ...

  9. cmake使用演示样例与整理总结

    本文代码托管于github  cmake_demo cmake中一些提前定义变量 PROJECT_SOURCE_DIR project的根文件夹 PROJECT_BINARY_DIR 执行cmake命 ...

随机推荐

  1. PHP方法之 mb_substr

    主要功能:中文字符串截取,解决substr中文截取问题,用法基本和substr相同,他可以指定编码. 函数原型:string mb_substr ( string $str , int $start  ...

  2. pandas模块(很详细归类),pd.concat(后续补充)

    6.12自我总结 一.pandas模块 import pandas as pd约定俗称为pd 1.模块官方文档地址 https://pandas.pydata.org/pandas-docs/stab ...

  3. Python 模块和包的概念

    模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  4. 我的Python分析成长之路10

    matplot数据可视化基础 制作提供信息的可视化(有时称作绘图)是数据分析中最重要任务之一. 1.图片(画布)与子图 plt.figure :创建一张空白的图片,可以指定图片的大小.像素. figu ...

  5. LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal

    题目 Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume ...

  6. LeetCode(3)Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  7. Developing

    To work with the Android code, you will need to use both Git and Repo. In most situations, you can u ...

  8. Charles-安装和配置

    一. 安装.破解charles工具 1. 安装压缩包中的charles_setup.exe,安装完成后先不启动charles. 2. 在安装文件中找到crack文件,将文件中的charles.jar拷 ...

  9. 【PL/SQL编程基础】

    [PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...

  10. Leetcode 372.超级次方

    超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: 输入: a ...