0

Lambda

Lý do chính không phải là để viết ngắn hơn, mà là capture: lambda dùng được biến cục bộ của nơi đang viết nó, còn hàm thường thì không.

Ví dụ: đếm số phần tử lớn hơn limit, với limit là biến cục bộ (chẳng hạn do người dùng nhập vào).

Cách 1: dùng hàm thường. Cách này không làm được gọn gàng. count_if chỉ truyền cho hàm một tham số là phần tử, nên hàm không có cách nào biết limit. Bạn buộc phải đưa limit thành biến toàn cục, mà đó là thói quen xấu.

int g_limit;                       // biến toàn cục, xấu
bool greater_than(int n) { return n > g_limit; }

g_limit = limit;
std::count_if(v.begin(), v.end(), greater_than);

Cách 2: viết functor. Trước C++11 người ta làm thế này: viết một struct có “nhét” limit vào bên trong.

struct GreaterThan {
    int limit;
    bool operator()(int n) const { return n > limit; }
};

std::count_if(v.begin(), v.end(), GreaterThan{limit});

Cách 3: dùng lambda

std::count_if(v.begin(), v.end(), [limit](int n) { return n > limit; });

Thực ra cách 3 chính là cách 2: compiler tự sinh ra một struct giống hệt GreaterThan cho bạn. Lambda chỉ là cách viết tắt cho functor. Ngoài ra còn hai lợi ích nữa:

  • Logic nằm ngay chỗ dùng. Đọc dòng count_if là hiểu ngay đếm cái gì, không phải cuộn đi tìm hàm ở chỗ khác.
  • Nhanh. Compiler thường inline lambda, nên nó nhanh bằng viết code trực tiếp, thường nhanh hơn truyền con trỏ hàm.

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.