Lambda表达式在C++ 11中引入。它们基本上是代码片段,可以嵌套在其他函数甚至函数调用语句中。通过将lambda表达式与auto关键字组合,可以在程序中稍后使用这些表达式。
在本文中,我们已经在C++中的Lambda表达式中详细讨论了Lambda表达式。在继续本文之前,请确保您已阅读链接的文章,或者了解lambda表达式语义,例如范围捕获,返回值。
C++ 14通过引入所谓的广义lambda进一步增强了lambda表达式的功能。要了解此功能,让我们举一个一般的例子。假设我们创建了一个lambda函数来返回两个整数的和。所以我们的lambda函数看起来像
[](int a, int b) -> int { return a + b; }
但是,如果以后需要获取两个浮点值的总和,该怎么办。因此,我们需要声明另一个仅适用于double值的lambda表达式。同样,每次输入参数的类型更改时,都需要重写lambda函数。
[](double a, double b) -> double { return a + b; }
在C++ 14之前,有一种方法可以通过使用模板参数来避免此问题,
template
[](T a, T b) -> T { return a + b };
C++ 14消除了这种情况,允许我们在lambda表达式的输入参数中使用关键字auto 。因此,编译器现在可以在编译期间推断出参数的类型。因此,在我们前面的示例中,一个同时适用于整数和浮点值的lambda表达式为
[](auto a, auto b) { return a + b; }
此功能的一个非常重要的应用是极大地增强了现有算法。以sort()函数为例。以下代码段将按降序对所有数据类型(如果它们已重载了<运算符)进行排序。
sort(container.begin(), container.end(),
[](auto i, auto j) -> bool { return i > j; }
以下是一些使用广义lambda的示例程序:
例子1
// Cpp program to demonstrate
// generalized lambda expressions
#include
#include
using namespace std;
int main()
{
// Declare a generalized lambda and store it in sum
auto sum = [](auto a, auto b) {
return a + b;
};
// Find sum of two integers
cout << sum(1, 6) << endl;
// Find sum of two floating numbers
cout << sum(1.0, 5.6) << endl;
// Find sum of two strings
cout << sum(string("Geeks"), string("ForGeeks")) << endl;
return 0;
}
输出:
7
6.6
GeeksForGeeks
范例2:
// Cpp program to demonstrate
// how to sort integers, floats, strings
// floating data types using a
// generalized lambda and sort function
#include
#include
#include
#include
using namespace std;
// Utility Function to print the elements of a collection
void printElements(auto& C)
{
for (auto e : C)
cout << e << " ";
cout << endl;
}
int main()
{
// Declare a generalized lambda and store it in greater
auto greater = [](auto a, auto b) -> bool {
return a > b;
};
// Initialize a vector of integers
vector vi = { 1, 4, 2, 1, 6, 62, 636 };
// Initialize a vector of doubles
vector vd = { 4.62, 161.3, 62.26, 13.4, 235.5 };
// Initialize a vector of strings
vector vs = { "Tom", "Harry", "Ram", "Shyam" };
// Sort integers
sort(vi.begin(), vi.end(), greater);
// Sort doubles
sort(vd.begin(), vd.end(), greater);
// Sort strings
sort(vs.begin(), vs.end(), greater);
printElements(vi);
printElements(vd);
printElements(vs);
return 0;
}
输出:
636 62 6 4 2 1 1
235.5 161.3 62.26 13.4 4.62
Tom Shyam Ram Harry
注意:通用Lambda表达式仅适用于C++标准14和更高版本。参考部分提供了支持C++ 14的编译器列表。
参考:
- https://isocpp.org/wiki/faq/cpp14-language
- http://en.cppreference.com/w/cpp/compiler_support