Hàm Lambda - Lambda là hàm nội tuyến (inline) không yêu cầu triển khai bên ngoài phạm vi chương trình chính.
Hàm Lambda cũng có thể dùng như giá trị để biến lưu trữ. Lambda có thể gọi là đối tượng có thể được gọi bởi hàm (gọi là functors).
Khi trình biên dịch gặp định nghĩa lambda, nó thường tạo đối tượng tùy chỉnh cho lambda.
Hàm lambda có chức năng nhiều hơn hàm thường, ví dụ có phương thức capture (nắm bắt) biến được sử dụng. Tuy nhiên biến được capture được xem như thành viên của đối tượng.
Đôi khi lambda cũng gọi là "đối tượng hàm" có phạm vi riêng và có thể truyền như tham số cho hàm thường. Lambda có vòng đời riêng.
[ ] - Capture (nắm bắt)
( ) - Tham số (tùy chọn)
→ - Giá trị trả về (tùy chọn)
{...} - Thân hàm.
Cú pháp lambda
[ ](int a) -> int { return a - 1; };
Capture - Mệnh đề nắm bắt cho phép lambda truy cập biến trong phạm vi đó.
Có hai cách nắm bắt giá trị biến:
Nắm bắt đối tượng theo tên - Tạo bản sao cục bộ của hàm lambda.
Ví dụ:
int main() {
set s;
// Thêm phần tử vào set
int i = 20;
for_each(s.begin(), s.end(), [i](T& elem) {
cout << elem.getVal() * i << endl;
});
}
Ở trên, giá trị được nắm bắt bằng cách tạo bản sao cục bộ của lambda.
Nắm bắt đối tượng theo tham chiếu - Thao tác trên ngữ cảnh của lambda, giá trị nắm bắt có thể thay đổi.
Ví dụ:
int main() {
set s;
// Thêm phần tử vào set
int result = 0;
for_each(s.begin(), s.end(), [&result](T& elem) {
result += elem.getVal();
});
cout << result << endl;
}
Lambda bên trong hàm thành viên
Lambda có thể dùng làm tham số trong hàm thường. Ví dụ:
class func {
public:
func(set s) : s1(s) {}
void func() {
remove_if(s1.begin(), s1.end(), [this](int i) -> bool { return (i < level); });
}
private:
set s1;
int result;
};