Chuyển tới nội dung chính

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 đến last nhưng không bao gồm last ([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

  1. 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.
  2. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  3. Nếu không tìm thấy phần tử nào thỏa mãn, find_if() trả về last.
  4. 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.
  5. 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

findTì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