📜  C++ 14中的广义Lambda表达式

📅  最后修改于: 2021-05-26 02:45:07             🧑  作者: Mango

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
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”