Обобщенные лямбда-выражения в C ++ 14

Опубликовано: 31 Декабря, 2021


Лямбда-выражения были введены в C ++ 11. По сути, они представляют собой фрагменты кода, которые могут быть вложены в другие функции и даже операторы вызова функций. Комбинируя лямбда-выражение с ключевым словом auto, эти выражения можно впоследствии использовать в программе.

Мы подробно обсудили лямбда-выражения в этой статье «Лямбда-выражения в C ++». Прежде чем продолжить работу с этой статьей, убедитесь, что вы прочитали статью по ссылке или знаете о семантике лямбда-выражения, такой как захват области действия, возвращаемое значение.

В C ++ 14 лямбда-выражения были усовершенствованы, введя так называемое обобщенное лямбда-выражение. Чтобы понять эту особенность, давайте рассмотрим общий пример. Предположим, мы создали лямбда-функцию для возврата суммы двух целых чисел. Итак, наша лямбда-функция будет выглядеть так:

[] (int a, int b) -> int {return a + b; }

Но что, если нам позже понадобится получить сумму двух значений с плавающей запятой. Поэтому нам нужно будет объявить другое лямбда-выражение, которое будет работать только для значений типа double. Точно так же каждый раз, когда наши входные параметры меняли тип, лямбда-функцию приходилось переписывать.

[] (двойная а, двойная б) -> двойная {верните а + б; }

До C ++ 14 был способ обойти эту проблему, используя параметры шаблона,

template<typename T>
[](T a, T b) -> T { return a + b };

C ++ 14 избавляется от этого и позволяет нам использовать ключевое слово auto во входных параметрах лямбда-выражения. Таким образом, компиляторы теперь могут определять тип параметров во время компиляции. Итак, в нашем предыдущем примере лямбда-выражение, которое будет работать как для целых чисел, так и для значений с плавающей запятой, будет выглядеть следующим образом:

[] (auto a, auto b) {вернуть a + b; }

Очень важным применением этой функции является то, что она значительно улучшает существующие алгоритмы. Возьмем, к примеру, функцию sort (). Следующий фрагмент отсортирует все типы данных (при условии, что они имеют перегруженные операторы <) в порядке убывания.

sort (container.begin (), container.end (), 
[] (auto i, auto j) -> bool {return i> j; }

Вот несколько примеров программ, использующих обобщенные лямбды:

Пример 1

// Cpp program to demonstrate
// generalized lambda expressions
#include <iostream>
#include <string>
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 <algorithm>
#include <iostream>
#include <string>
#include <vector>
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< int > vi = { 1, 4, 2, 1, 6, 62, 636 };
// Initialize a vector of doubles
vector< double > vd = { 4.62, 161.3, 62.26, 13.4, 235.5 };
// Initialize a vector of strings
vector<string> 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                                                                         
Том Шиам Рам Гарри  

Примечание. Обобщенные лямбда-выражения работают только для стандартов 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 и многому другому, см. Полный курс подготовки к собеседованию. Мои личные заметки arrow_drop_upSave
C++ C