std::find_if
#include <algorithm>
template <class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
Tìm kiếm phần tử đầu tiên trong một phạm vi (range) thỏa mãn một điều kiện cụ thể được xác định bởi một hàm vị từ (predicate). Khác với find()
tìm kiếm giá trị bằng nhau, find_if()
cho phép bạn tìm kiếm dựa trên bất kỳ tiêu chí nào.
Tham số
first
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi cần tìm kiếm.
last
- Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần tìm kiếm. Phạm vi tìm kiếm bao gồm từ
first
đếnlast
nhưng không bao gồmlast
([first, last)
).
pred
- Một hàm vị từ (unary predicate) nhận một đối số là phần tử trong phạm vi và trả về true nếu phần tử thỏa mãn điều kiện tìm kiếm, false nếu không. Đây có thể là:
- Con trỏ hàm (function pointer)
- Đối tượng hàm (function object/functor)
- Biểu thức lambda (lambda expression)
Giá trị trả về
- Iterator trỏ đến phần tử đầu tiên trong phạm vi
[first, last)
thỏa mãn điều kiện được chỉ định bởi hàm vị từpred
. - Nếu không tìm thấy phần tử nào thỏa mãn điều kiện trong phạm vi, hàm trả về
last
.
Đặc điểm
find_if()
chỉ tìm kiếm sự xuất hiện đầu tiên của phần tử thỏa mãn điều kiện.- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. - Nếu không tìm thấy phần tử nào thỏa mãn,
find_if()
trả vềlast
. - Trong C++11 trở lên, sử dụng biểu thức lambda cho hàm vị từ
pred
thường ngắn gọn và dễ đọc hơn. find_if()
thường được sử dụng để tìm kiếm phần tử trong một container (như vector, array, list, ...) dựa trên một tiêu chí phức tạp hơn là so sánh bằng. Ví dụ:- Tìm phần tử đầu tiên là số chẵn.
- Tìm phần tử đầu tiên lớn hơn một giá trị cho trước.
- Tìm chuỗi đầu tiên có độ dài lớn hơn 5.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
// Hàm vị từ kiểm tra số chẵn
bool isEven(int i) {
return (i % 2) == 0;
}
int main() {
std::vector<int> numbers = {1, 3, 5, 2, 4, 6};
// Tìm kiếm số chẵn đầu tiên sử dụng con trỏ hàm
std::vector<int>::iterator it = std::find_if(numbers.begin(), numbers.end(), isEven);
if (it != numbers.end()) {
std::cout << "First even number found: " << *it << " at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "No even number found in the vector.\n";
}
// Tìm kiếm số lớn hơn 4 sử dụng biểu thức lambda
it = std::find_if(numbers.begin(), numbers.end(), [](int i){ return i > 4; });
if (it != numbers.end()) {
std::cout << "First number greater than 4 found: " << *it << " at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "No number greater than 4 found in the vector.\n";
}
return 0;
}
Các hàm liên quan
find | Tìm kiếm phần tử đầu tiên trong một phạm vi có giá trị bằng với một giá trị cho trước |
for_each | Áp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi được chỉ định |