Menu
CoddyTech

Tổng quan và triết lý của STL

Thuộc phần Lập trình hướng đối tượng trong hành trình C++ của Coddy. Bài học 70 trên 104.

Standard Template Library (STL) là một tập hợp các lớp và hàm dựa trên template, cung cấp các cấu trúc dữ liệu và thuật toán phổ biến. Được xây dựng dựa trên các khái niệm template bạn đã học, STL thể hiện một triết lý thiết kế mạnh mẽ: tách biệt việc lưu trữ dữ liệu với việc thao tác dữ liệu.

STL được tổ chức quanh ba thành phần cốt lõi hoạt động cùng nhau:

Thành phầnMục đíchVí dụ
Bộ chứaLưu trữ tập hợp các đối tượngvector, map, set
Bộ lặpCung cấp quyền truy cập vào các phần tử trong bộ chứaĐầu vào, đầu ra, truy cập ngẫu nhiên
Thuật toánThực hiện các thao tác trên dữ liệusort, find, transform

Điều cốt lõi là thuật toán không trực tiếp biết về các vùng chứa, chúng hoạt động thông qua trình lặp. Điều này có nghĩa là một thuật toán sort duy nhất hoạt động với vector, mảng và mọi vùng chứa cung cấp đúng kiểu trình lặp:

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

int main() {
    std::vector<int> nums = {5, 2, 8, 1, 9};
    
    std::sort(nums.begin(), nums.end());
    
    for (int n : nums) {
        std::cout << n << " ";
    }
    // Đầu ra: 1 2 5 8 9
}

Cách tách biệt này cho phép bạn kết hợp linh hoạt: dùng bất kỳ thuật toán nào với bất kỳ vùng chứa tương thích nào mà không cần viết code mới. STL cung cấp các phần triển khai đã được kiểm chứng kỹ lưỡng và tối ưu hóa, để bạn tập trung giải quyết vấn đề thay vì tạo lại các cấu trúc dữ liệu phổ biến.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống xử lý dữ liệu đơn giản để minh họa triết lý của STL về việc tách biệt thùng chứa (container), bộ lặp (iterator) và thuật toán. Bạn sẽ tạo một module tiện ích hoạt động với các thành phần STL và một chương trình chính cho thấy những phần này kết hợp với nhau như thế nào.

Bạn sẽ tạo hai tệp:

  • DataProcessor.h: Định nghĩa các hàm tiện ích hoạt động với thùng chứa STL thông qua bộ lặp, qua đó minh họa triết lý thiết kế của STL.

    Tạo một hàm có tên printVector, nhận một std::vector<int>& và in tất cả phần tử, cách nhau bằng dấu cách, rồi xuống dòng. Dùng bộ lặp (begin() và end()) để duyệt thùng chứa.

    Tạo một hàm có tên sortAndPrint, nhận một std::vector<int>&, sắp xếp vector bằng std::sort, rồi in các phần tử đã sắp xếp, cách nhau bằng dấu cách, sau đó xuống dòng.

    Tạo một hàm có tên findElement, nhận một std::vector<int>& và một giá trị int cần tìm. Dùng std::find để tìm phần tử đó. Nếu tìm thấy, in Found: <value>. Nếu không tìm thấy, in Not found: <value>.

    Tạo một hàm có tên getSum, nhận một std::vector<int>& và trả về tổng của tất cả phần tử. Bạn có thể dùng một vòng lặp đơn giản với bộ lặp để tính tổng.

  • main.cpp: Đọc dữ liệu đầu vào và minh họa cách các thành phần STL hoạt động cùng nhau.

    Đọc năm giá trị đầu vào, mỗi giá trị trên một dòng riêng:

    1. Số nguyên thứ nhất
    2. Số nguyên thứ hai
    3. Số nguyên thứ ba
    4. Số nguyên thứ tư
    5. Giá trị cần tìm

    Tạo một std::vector<int> và thêm bốn số nguyên đầu tiên vào đó. Sau đó, minh họa triết lý của STL bằng cách:

    1. In Original:, rồi gọi printVector
    2. In Sorted:, rồi gọi sortAndPrint
    3. Gọi findElement với giá trị cần tìm
    4. In Sum: <result> bằng getSum

Ví dụ, với các giá trị đầu vào 5, 2, 8, 1 và 8:

Original: 5 2 8 1 
Sorted: 1 2 5 8 
Found: 8
Sum: 16

Với các giá trị đầu vào 10, 30, 20, 40 và 15:

Original: 10 30 20 40 
Sorted: 10 20 30 40 
Not found: 15
Sum: 100

Hãy chú ý cách các hàm của bạn thao tác với vector thông qua bộ lặp, cũng như cách std::sort và std::find hoạt động trên bất kỳ thùng chứa nào cung cấp đúng kiểu bộ lặp. Đây chính là sức mạnh trong thiết kế của STL: các thuật toán được tách biệt khỏi thùng chứa và chỉ kết nối với chúng thông qua bộ lặp.

Tự làm thử

#include <iostream>
#include <vector>
#include "DataProcessor.h"

using namespace std;

int main() {
    // Đọc năm số nguyên từ đầu vào
    int num1, num2, num3, num4, searchValue;
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> num4;
    cin >> searchValue;
    
    // TODO: Tạo một vector và thêm bốn số nguyên đầu tiên vào đó
    
    // TODO: In ra "Original: " rồi gọi printVector
    
    // TODO: In ra "Sorted: " rồi gọi sortAndPrint
    
    // TODO: Gọi findElement với giá trị cần tìm
    
    // TODO: In ra "Sum: " rồi đến kết quả của getSum
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C++ online