Bỏ qua để đến nội dung

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.

#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
#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;
}
#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;
}
#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;
}
  • 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::function cho phép lưu trữ lambda (hoặc con trỏ hàm) vào một biến để dùng lại