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

std::find

#include <algorithm>

template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

Tìm kiếm phần tử đầu tiên trong một phạm vi (range) có giá trị bằng với một giá trị cho trước.

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)).

val

  • Giá trị cần tìm kiếm trong phạm vi.

Giá trị trả về

  • Iterator trỏ đến phần tử đầu tiên trong phạm vi [first, last) có giá trị bằng val.
  • Nếu không tìm thấy phần tử nào có giá trị bằng val, hàm trả về last.

Đặc điểm

  1. find() chỉ tìm kiếm phần tử đầu tiên có giá trị bằng val. Nếu có nhiều phần tử trùng lặp, nó sẽ trả về iterator đến phần tử đầu tiên được tìm thấy.
  2. Phạm vi [first, last) là "nửa mở", nghĩa là không bao gồm phần tử last.
  3. Để sử dụng find(), kiểu dữ liệu của các phần tử trong phạm vi cần hỗ trợ toán tử so sánh bằng == để có thể so sánh với val. Đối với các kiểu dữ liệu tự định nghĩa, bạn cần đảm bảo đã nạp chồng toán tử == cho kiểu dữ liệu đó.
  4. find() có độ phức tạp tuyến tính O(n), tức là trong trường hợp xấu nhất (phần tử không tồn tại), nó sẽ phải duyệt qua toàn bộ phạm vi.
  5. find() thường được sử dụng để kiểm tra xem một giá trị có tồn tại trong một container (như vector, array, list, ...) hay không, và nếu có, để xác định vị trí của nó.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main() {
std::vector<int> numbers = {10, 20, 30, 40, 30, 50};

// Tìm kiếm số 30
std::vector<int>::iterator it = std::find(numbers.begin(), numbers.end(), 30);

if (it != numbers.end()) {
std::cout << "Found 30 at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "30 not found in the vector.\n";
}

// Tìm kiếm số 60
it = std::find(numbers.begin(), numbers.end(), 60);

if (it != numbers.end()) {
std::cout << "Found 60 at position: " << (it - numbers.begin()) << std::endl;
} else {
std::cout << "60 not found in the vector.\n";
}

// Tìm kiếm ký tự trong chuỗi
std::string myString = "Hello World";
std::string::iterator sit = std::find(myString.begin(), myString.end(), 'W');
if (sit != myString.end()){
std::cout << "Found W at position: " << (sit - myString.begin()) << std::endl;
}

return 0;
}

Các hàm liên quan

searchTìm kiếm sự xuất hiện đầu tiên của một dãy con trong một phạm vi lớn hơn
binary_searchKiểm tra xem một giá trị cho trước có tồn tại trong một phạm vi đã được sắp xếp hay không, sử dụng thuật toán tìm kiếm nhị phân
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