Unlock the Power of C++ Lambda Expressions

Creating a Lambda Expression

A basic lambda expression consists of three parts: the lambda introducer [], the parameter list (), and the function body.

auto greet = []() { std::cout << "Hello World!" << std::endl; };
greet(); // Output: Hello World!

Lambda Functions with Parameters

Just like regular functions, lambda expressions can take parameters.

auto add = [](int a, int b) { return a + b; };
std::cout << add(2, 3) << std::endl; // Output: 5

Return Types and Lambda Functions

C++ lambda expressions can also have a return type, which can be implicitly deduced by the compiler or explicitly defined.

auto calculate = [](int a, int b, std::string op) {
    if (op == "sum") return a + b;
    else return (double)a / b;
};
std::cout << calculate(4, 2, "sum") << std::endl; // Output: 6
std::cout << calculate(4, 2, "avg") << std::endl; // Output: 2

Capture Clause: Accessing Variables

By default, lambda functions cannot access variables of the enclosing function. To overcome this, we use the capture clause, which allows us to capture variables in two ways: by value or by reference.

Capture by Value

When capturing by value, the actual value is copied when the lambda is created.

int num_main = 100;
auto lambda = [num_main]() { return num_main + 78; };
std::cout << lambda() << std::endl; // Output: 178

Capture by Reference

When capturing by reference, the lambda has access to the variable’s address.

int num = 0;
auto increment_by_one = [&num]() { num++; };
increment_by_one();
std::cout << num << std::endl; // Output: 1

Lambda Functions as Arguments in STL Algorithms

Lambda expressions can be used as arguments in STL algorithms, making them incredibly versatile.

std::vector<int> nums = {1, 2, 3, 4, 5};
auto count_even = std::count_if(nums.begin(), nums.end(), [](int num) { return num % 2 == 0; });
std::cout << "Total even numbers: " << count_even << std::endl;

Frequently Asked Questions

  • Can we use both capture by variable and capture by reference in a single lambda expression? Yes, we can.
  • How do we explicitly define the return type of a lambda function? We can use the -> operator to specify the return type.
  • What is a generic lambda? Introduced in C++14, generic lambdas support generic template parameters in the lambda function.

Advanced Lambda Expression Topics

  • Mutable Keyword: Allows lambda to modify variables captured by value inside the lambda body without affecting its original value in the enclosing function.
  • Immediately Invoked Lambda Expression: A lambda expression that is immediately invoked as soon as it is defined.
  • Extended Syntax: The comprehensive syntax of C++ lambda expressions, which includes all the lambda elements discussed above.

Leave a Reply