Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm set::find() trong C++ STL

set::find(k) tìm kiếm khóa k trong set, trả về iterator trỏ đến phần tử nếu tìm thấy, ngược lại trả về end().

Đặc điểm

  • Độ phức tạp: O(log n).
  • Không sửa đổi container.
  • Vì set chỉ chứa key duy nhất, find tối đa trả về 1 phần tử.
  • Iterator trả về là const – không thể sửa key qua iterator.

Ví dụ cơ bản

#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> s = {7, 6, 1, 4, 2, 9, 10};

    auto it = s.find(6);
    if (it != s.end()) {
        cout << "Found: " << *it << endl; // 6
        // In từ 6 đến cuối
        cout << "Elements from 6: ";
        for (; it != s.end(); ++it) cout << *it << ' '; // 6 7 9 10
        cout << endl;
    } else {
        cout << "Not found\n";
    }

    // Kiểm tra tồn tại
    cout << "Has 5? " << (s.find(5) != s.end()) << endl; // 0
    cout << "Has 9? " << (s.find(9) != s.end()) << endl; // 1

    return 0;
}

Kết quả

Found: 6
Elements from 6: 6 7 9 10
Has 5? 0
Has 9? 1

find() vs count() vs lower_bound()

HàmTrả vềDùng khi
find(k)iterator (hoặc end())Cần iterator để duyệt tiếp, hoặc lấy giá trị (map)
count(k)0 hoặc 1 (set), ≥0 (multiset)Chỉ cần biết có/không (bool)
lower_bound(k)iterator ≥ kCần tìm khoảng, chèn hint, hoặc key không chính xác

Ứng dụng với Map

Với map, find trả về iterator đến pair<const Key, Value> – rất hữu ích để lấy value:

map<string, int> m = {{"Alice", 25}, {"Bob", 30}};
auto it = m.find("Alice");
if (it != m.end()) cout << it->second; // 25

Lưu ý

  • Không dùng operator[] trên set (không có).
  • find không làm thay đổi container – an toàn cho const set.
  • C++20: contains(k) trả về bool – thay thế find(k) != end().