Lambda function
Lambda là một hàm không có tên (anonymous function), được định nghĩa ngay tại nơi sử dụng - rất hữu ích khi cần một hàm ngắn, dùng một lần, đặc biệt khi truyền cho các hàm khác.
Cú pháp cơ bản
Phần tiêu đề “Cú pháp cơ bản”#include <iostream>
int main() { auto greet = []() { std::cout << "Xin chao!" << std::endl; };
greet(); // Gọi lambda giống hàm bình thường
return 0;}Cấu trúc: [capture](tham_số) -> kiểu_trả_về { thân_hàm }
[](capture list): quy định lambda có thể truy cập các biến bên ngoài như thế nào(): danh sách tham số, giống hàm thông thường-> kiểu_trả_về: tùy chọn, trình biên dịch thường tự suy luận được
Lambda với tham số và giá trị trả về
Phần tiêu đề “Lambda với tham số và giá trị trả về”#include <iostream>
int main() { auto add = [](int a, int b) { return a + b; // Kiểu trả về được suy luận tự động là int };
std::cout << add(3, 4) << std::endl; // 7
return 0;}Capture list: truy cập biến bên ngoài
Phần tiêu đề “Capture list: truy cập biến bên ngoài”#include <iostream>
int main() { int factor = 10;
// Capture theo giá trị (copy) auto multiply_by_value = [factor](int x) { return x * factor; };
// Capture theo tham chiếu (có thể sửa đổi biến gốc) auto multiply_by_ref = [&factor](int x) { factor = 20; // Sửa đổi biến factor bên ngoài return x * factor; };
std::cout << multiply_by_value(5) << std::endl; // 50 std::cout << multiply_by_ref(5) << std::endl; // 100 std::cout << factor << std::endl; // 20 (đã bị thay đổi)
return 0;}| Capture | Ý nghĩa |
|---|---|
[] |
Không capture biến nào bên ngoài |
[x] |
Capture biến x theo giá trị (bản sao) |
[&x] |
Capture biến x theo tham chiếu |
[=] |
Capture tất cả biến bên ngoài theo giá trị |
[&] |
Capture tất cả biến bên ngoài theo tham chiếu |
Dùng lambda với thuật toán trong <algorithm>
Phần tiêu đề “Dùng lambda với thuật toán trong <algorithm>”Đây là ứng dụng phổ biến nhất của lambda - truyền trực tiếp một hành vi tùy chỉnh cho các hàm thuật toán:
#include <iostream>#include <vector>#include <algorithm>
int main() { std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
// Sắp xếp giảm dần bằng lambda std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; });
for (int n : numbers) { std::cout << n << " "; } // 9 8 5 3 2 1
// Đếm số lượng phần tử chẵn int count = std::count_if(numbers.begin(), numbers.end(), [](int n) { return n % 2 == 0; }); std::cout << std::endl << count << std::endl; // 2
return 0;}Gán lambda cho biến kiểu std::function
Phần tiêu đề “Gán lambda cho biến kiểu std::function”#include <functional>#include <iostream>
int main() { std::function<int(int, int)> operation;
operation = [](int a, int b) { return a + b; }; std::cout << operation(3, 4) << std::endl; // 7
operation = [](int a, int b) { return a * b; }; std::cout << operation(3, 4) << std::endl; // 12
return 0;}Tổng kết
Phần tiêu đề “Tổng kết”- Lambda là hàm không tên, định nghĩa ngay tại nơi dùng, cú pháp
[capture](tham_số) { thân_hàm } - Capture list (
[],[x],[&x],[=],[&]) quy định cách lambda truy cập biến bên ngoài - Lambda thường dùng để truyền hành vi tùy chỉnh cho các hàm thuật toán như
std::sort,std::count_if std::functioncho phép lưu trữ lambda (hoặc con trỏ hàm) vào một biến để dùng lại