Các thuật toán tìm kiếm phổ biến trong thư viện STL của C++

Các thuật toán tìm kiếm trong Thư viện Tiêu chuẩn (STL) của C++ cung cấp cơ chế linh hoạt và hiệu quả để duyệt, kiểm tra và đếm phần tử trong các container. Dưới đây là sáu hàm tiêu biểu được thiết kế cho các nhiệm vụ khác nhau — từ tìm kiếm tuyến tính đơn giản đến kiểm tra điều kiện nâng cao và thống kê có lọc.

1. std::find

Tìm kiếm tuần tự một giá trị cụ thể trong khoảng [first, last). Trả về iterator trỏ tới phần tử đầu tiên khớp; nếu không tìm thấy, trả về last.

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

struct Student {
    std::string full_name;
    unsigned int score;
    bool operator==(const Student& other) const {
        return score == other.score && full_name == other.full_name;
    }
};

int main() {
    std::vector<int> numbers = {2, 4, 6, 8, 10, 7, 9};
    auto pos = std::find(numbers.begin(), numbers.end(), 7);
    if (pos != numbers.end()) {
        std::cout << "Phát hiện giá trị: " << *pos << "\n";
    }

    std::vector<Student> roster = {
        {"Nguyễn Văn A", 85},
        {"Trần Thị B", 92},
        {"Lê Văn C", 76}
    };
    Student target{"Trần Thị B", 92};
    auto found = std::find(roster.begin(), roster.end(), target);
    if (found != roster.end()) {
        std::cout << "Tìm thấy sinh viên: " << found->full_name << "\n";
    }
}

2. std::find_if

Tìm phần tử đầu tiên thỏa mãn một điều kiện logic do hàm hoặc functor cung cấp. Hàm kiểm tra phải trả về bool.

struct IsPrime {
    bool operator()(int n) const {
        if (n < 2) return false;
        for (int i = 2; i * i <= n; ++i)
            if (n % i == 0) return false;
        return true;
    }
};

void demo_find_if() {
    std::vector<int> data = {4, 6, 8, 9, 11, 13};
    auto prime_it = std::find_if(data.begin(), data.end(), IsPrime{});
    if (prime_it != data.end()) {
        std::cout << "Số nguyên tố đầu tiên: " << *prime_it << "\n";
    }
}

3. std::adjacent_find

Tìm cặp phần tử liền kề có giá trị giống nhau. Trả về iterator trỏ tới phần tử đầu tiên trong cặp, hoặc last nếu không tồn tại.

void demo_adjacent() {
    std::vector<char> chars = {'a', 'b', 'c', 'c', 'd', 'e'};
    auto dup = std::adjacent_find(chars.begin(), chars.end());
    if (dup != chars.end()) {
        std::cout << "Ký tự lặp liền kề: '" << *dup << "'\n";
    }
}

4. std::binary_search

Kiểm tra sự tồn tại của một giá trị trong dãy đã sắp xếp theo thứ tự tăng dần. Yêu cầu bắt buộc: container phải được sắp xếp trước khi gọi.

void demo_binary() {
    std::vector<double> sorted = {1.1, 2.3, 3.7, 4.9, 5.0, 6.2};
    bool exists = std::binary_search(sorted.begin(), sorted.end(), 4.9);
    std::cout << (exists ? "Giá trị tồn tại" : "Không tìm thấy") << "\n";
}

5. std::count

Đếm số lần xuất hiện của một giá trị cụ thể trong khoảng chỉ định.

void demo_count() {
    std::vector<std::string> words = {"cat", "dog", "cat", "bird", "cat"};
    int cat_count = std::count(words.begin(), words.end(), "cat");
    std::cout << "Số lần 'cat' xuất hiện: " << cat_count << "\n";
}

6. std::count_if

Đếm số phần tử thỏa mãn một điều kiện tùy chỉnh — hữu ích khi cần phân tích có điều kiện như độ dài chuỗi, mức độ lớn hơn ngưỡng, v.v.

struct LongerThanFive {
    bool operator()(const std::string& s) const {
        return s.length() > 5;
    }
};

void demo_count_if() {
    std::vector<std::string> names = {"An", "Bình", "Chiến", "Đức", "Hoàng"};
    int long_names = std::count_if(names.begin(), names.end(), LongerThanFive{});
    std::cout << "Tên dài hơn 5 ký tự: " << long_names << "\n";
}

Thẻ: STL cpp Algorithms find count

Đăng vào ngày 22 tháng 7 lúc 19:10