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

std::find_if_not

#include <algorithm>

template <class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);

Tìm kiếm phần tử đầu tiên trong một phạm vi (range) không 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). Nói cách khác, nó tìm phần tử đầu tiên mà khi áp dụng hàm vị từ cho nó, kết quả trả về là false.

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, false nếu không. find_if_not() sẽ tìm phần tử đầu tiên mà hàm này trả về false. Đâ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) không thỏa mãn điều kiện được chỉ định bởi hàm vị từ pred (tức là pred trả về false khi áp dụng cho phần tử này).
  • Nếu tất cả các phần tử đều thỏa mãn điều kiện (tức là pred luôn trả về true), hoặc nếu phạm vi rỗng, hàm trả về last.

Đặc điểm

  1. find_if_not() chỉ tìm kiếm sự xuất hiện đầu tiên của phần tử không 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 tất cả các phần tử đều thỏa mãn điều kiện (nghĩa là không có phần tử nào làm cho pred trả về false), find_if_not() 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_not() có thể được coi là tương đương với find_if() với điều kiện phủ định, nhưng sử dụng trực tiếp find_if_not() thường rõ ràng hơn.
  6. find_if_not() thường được sử dụng để tìm kiếm phần tử đầu tiên không tuân theo một quy tắc hoặc không có một tính chất cụ thể trong một container. Ví dụ:
    • Tìm phần tử đầu tiên không phải là số chẵn.
    • Tìm phần tử đầu tiên không lớn hơn một giá trị cho trước.
    • Tìm chuỗi đầu tiên không 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 = {2, 4, 6, 1, 3, 5};

// Tìm kiếm số không phải số chẵn đầu tiên (tức là số lẻ)
std::vector<int>::iterator it = std::find_if_not(numbers.begin(), numbers.end(), isEven);

if (it != numbers.end()) {
std::cout << "First odd number found: " << *it << " at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "No odd number found in the vector.\n";
}

// Tìm kiếm số không lớn hơn 4 đầu tiên sử dụng biểu thức lambda
it = std::find_if_not(numbers.begin(), numbers.end(), [](int i){ return i > 4; });

if (it != numbers.end()) {
std::cout << "First number not greater than 4 found: " << *it << " at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "No number not greater than 4 found in the vector.\n";
}

return 0;
}

Các hàm liên quan

find_ifTìm kiếm phần tử đầu tiên trong một phạm vi thỏa mãn một điều kiện cụ thể được xác định bởi một hàm vị từ
mismatchSo sánh hai phạm vi và tìm vị trí đầu tiên mà các phần tử tương ứng không khớp
none_ofKiểm tra xem liệu không có phần tử nào trong một phạm vi thỏa mãn một điều kiện cụ thể hay không