Hướng dẫn nhanh về biểu thức Lambda trong C ++
Tìm hiểu cách lambdas có thể làm cho mã của bạn hiệu quả hơn và dễ bảo trì hơn.
Các ngôn ngữ lập trình liên tục phát triển, ngay cả những ngôn ngữ như C ++ đã thành lập từ lâu. Họ thêm các chức năng vào các thư viện tiêu chuẩn và thực hiện các thay đổi khác để dễ dàng thực hiện công việc của các lập trình viên làm việc trong một lĩnh vực động.
Là một phần của các bản cập nhật do sự phát triển của ngôn ngữ mang lại, C ++ đã bổ sung hỗ trợ cho các biểu thức lambda trong bản phát hành năm 2011 của nó.
Chính xác thì biểu thức lambda là gì và làm thế nào bạn có thể sử dụng nó để tạo lợi thế cho mình với tư cách là một lập trình viên C ++?
Mục Lục
Biểu thức Lambda là gì?
Biểu thức lambda còn được gọi là hàm lambda. Đó là một biểu thức nội dòng với khả năng chấp nhận các đối số, thực hiện các phép toán và trả về một giá trị, giống như một hàm thông thường.
Bạn có thể sử dụng lambda bên trong một hàm khác và gán nó cho một biến. Các hàm lamba là một cách thực tế để xác định một đối tượng hàm ẩn danh trong một chương trình. Gần như mọi ngôn ngữ đều hỗ trợ lambdas, mặc dù mỗi cách triển khai khác nhau so với những ngôn ngữ khác.
Các phần của Biểu thức Lambda C ++ là gì?
Các biểu thức Lambda rất dễ sử dụng trong C ++. Bạn có thể chia nhỏ cú pháp của biểu thức lambda trong C ++ như sau:
[capture_clause](parameters) options { expression_body; }
Ví dụ:
int val = 13;
auto sumPlusVal = [val](int a, int b) mutable noexcept ->int { return val + a + b ; };
sumPlusVal(2, 5);
Mã này khai báo sumPlusVal biến auto vì một biểu thức lambda có thể chấp nhận và trả về bất kỳ kiểu dữ liệu nào. Điều này phụ thuộc vào trình biên dịch để xác định kiểu trong quá trình biên dịch.
Từ đoạn mã trên, bạn có thể thấy rằng biểu thức lambda chứa một số phần chỉ định cách nó hoạt động. Dưới đây là tổng quan nhanh về từng thành phần này.
- Nắm bắt mệnh đề: Đây là phần đầu tiên của biểu thức lambda nơi bạn có thể chỉ định các biến đã có từ trước hoặc xác định các biến mới để sử dụng trong thân biểu thức. Có nhiều cách khác nhau để chỉ định các ảnh chụp, ví dụ:
auto addTwo = [foo](){ return foo + 2; };
auto addThree = [&bar](){ return bar + 3; };
auto addAllVal = [=](){ return foo + bar; };
auto addAllRef = [&](){ return foo + bar; };
auto createVarInCapture = [fooBar = foo + bar](){ return fooBar * 5; };
auto errorExpression = [](){ return foo + 2; }; - Thông số: Phần này của biểu thức lambda cũng là tùy chọn. Nó chứa các tham số hàm theo yêu cầu của lambda. Điều này không khác với cách thông thường mà bạn định nghĩa các tham số hàm trong C ++.
- Tùy chọn: Bạn cũng có thể chỉ định các tùy chọn khi xác định biểu thức lambda. Một số tùy chọn bạn có thể sử dụng là: có thể thay đổi, ngoại lệ (ví dụ không có ngoại lệ trong mã mẫu đầu tiên), -> return_type (ví dụ -> int), đòi hỏi, thuộc tínhv.v. có thể thay đổi tùy chọn này thường được sử dụng vì nó cho phép các ảnh chụp có thể sửa đổi được bên trong lambda. Đoạn mã dưới đây chứng minh điều này.
int value = 10;
auto decrement = [value](){ return --value; };
auto increment = [value]() mutable { return ++value; };
increment();Mặc dù các tùy chọn khác hiếm khi được sử dụng, bạn có thể tìm hiểu thêm thông tin về chúng trên trang cppreference.com trên lambdas.
- Cơ quan biểu hiện: Đây là phần thân của biểu thức lambda thực thi và trả về một giá trị, giống như một hàm. Nếu cần, bạn có thể chia phần nội dung của biểu thức lambda thành nhiều dòng. Tuy nhiên, cách tốt nhất là giữ cho nó ngắn gọn nhất có thể để ngăn chặn mã vô tổ chức.
Lợi ích của Biểu thức Lambda là gì?
Có rất nhiều lợi ích khi sử dụng các hàm lambda trong mã của bạn. Ngoài việc tăng tốc độ phát triển và hiệu quả, những lợi ích hàng đầu mà bạn nhận được từ lambdas như sau:
- Biểu thức Lambda giúp giữ cho mã sạch. Một trong những cách tốt nhất để giữ cho mã của bạn đơn giản và gọn gàng là sử dụng lambdas nếu có thể. Điều này có thể rất hữu ích trong việc duy trì cấu trúc mã có thể đọc và sử dụng lại.
- Bạn có thể truyền lambdas cho các hàm khác dưới dạng tham số. Thư viện chuẩn C ++ std :: sort () phương pháp sử dụng lợi ích này. Bạn có thể truyền lambda làm một trong các tham số của phương thức này để chỉ định cách hàm sẽ thực hiện sắp xếp. Ví dụ:
std::vector<int> arr = {2, 5, 1, 3, 4};
std::sort(arr.begin(), arr.end(), [](int a, int b){ return a < b; }); - Lambdas có thể tái sử dụng. Đôi khi, bạn có thể muốn sử dụng lại một khối mã trong phạm vi của một hàm trong chương trình của mình mà không cần phải xác định một hàm mới. Lambdas có thể rất hữu ích trong những trường hợp như vậy. Hãy xem xét ví dụ sau về biểu thức lambda có thể sử dụng lại:
#include <iostream>
using namespace std;int main() {
auto addUp = [](auto a, auto b, auto c) noexcept {
cout << "Now adding up... " << a << ", " << b << " and " << c << endl;
return a + b + c ;
};cout << addUp(22, 33, 44) << endl;
cout << addUp(string("Happy "), string("Birth"), string("day")) << endl;
cout << addUp(true, false, true) << std::endl;
}Chương trình này tạo ra kết quả sau:
Ví dụ này cho thấy việc xác định lambda đơn giản như thế nào để bạn có thể sử dụng nó với bất kỳ kiểu nào.
Sử dụng Lambdas trong C ++
Có nhiều lợi ích khác mà biểu thức lambda cung cấp và bạn sẽ khám phá ra chúng khi cấu trúc chương trình của bạn ngày càng phức tạp. Trên thực tế, các lập trình viên C ++ đôi khi gọi các biểu thức lambda là các bao đóng bởi vì chúng là một cách tuyệt vời để triển khai các bao đóng trong mã.
Bạn nên xem xét các biểu thức lambda nếu bạn muốn kết hợp các khái niệm C ++ hiện đại vào cơ sở mã của mình.