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.