### Khái niệm về hàm ẩn danh (Lambda Function) trong C++
**Hàm ẩn danh** (hay còn gọi là **hàm lambda**) trong C++ là một hàm không có tên, cho phép định nghĩa các hàm ngay tại chỗ mà không cần phải khai báo một hàm riêng biệt. Hàm lambda thường được sử dụng để thực hiện các tác vụ ngắn gọn và có thể được truyền như một đối số cho các hàm khác.
**Cú pháp cơ bản**:
```cpp
[capture](parameters) -> return_type {
// Thân hàm
}
```
- **capture**: Xác định cách mà biến từ phạm vi bên ngoài sẽ được sử dụng trong hàm lambda.
- **parameters**: Danh sách tham số (giống như trong hàm thông thường).
- **return_type**: Kiểu trả về (có thể bỏ qua nếu có thể suy diễn).
- **thân hàm**: Các câu lệnh thực hiện tác vụ của hàm.
### Ví dụ về hàm ẩn danh
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> numbers = {1, 2, 3, 4, 5};
// Sử dụng hàm lambda để in các số trong vector
for_each(numbers.begin(), numbers.end(), [](int n) {
cout << n << " ";
});
cout << endl;
// Sử dụng hàm lambda để tìm số lớn hơn 3
auto it = find_if(numbers.begin(), numbers.end(), [](int n) {
return n > 3;
});
if (it != numbers.end()) {
cout << "Số lớn hơn 3 đầu tiên là: " << *it << endl;
}
return 0;
}
```
### Ứng dụng của hàm ẩn danh
1. **Tính ngắn gọn và dễ đọc**: Hàm lambda giúp viết mã ngắn gọn hơn, đặc biệt khi sử dụng với các thuật toán STL như `for_each`, `find_if`, `sort`, v.v.
2. **Truyền vào như đối số**: Hàm lambda có thể được truyền trực tiếp vào các hàm khác mà không cần phải định nghĩa trước, giúp tăng tính linh hoạt.