Trang tài liệu
Khóa học C++ nền tảng
Chương 11. Thư viện mẫu chuẩn (STL)
THƯ VIỆN TEMPLATE CHUẨN C++ (STL)

THƯ VIỆN TEMPLATE CHUẨN C++ (STL)

Thư viện template chuẩn C++ (STL) là tập hợp các tệp tiêu đề cung cấp một số cấu trúc dữ liệu, thuật toán và hàm để đơn giản hóa trải nghiệm viết mã code C++ của bạn. Mục đích chính của STL là tiết kiệm thời gian và tăng hiệu quả bằng cách cung cấp một bộ công cụ hữu ích sẵn sàng để sử dụng. Các tính năng được sử dụng phổ biến nhất của STL có thể được chia thành ba loại chính: vùng lưu trữ, thuật toán và trình vòng lặp.

Vùng lưu trữ

  • Lưu trữ trình tự: Đây là các cấu trúc dữ liệu tuyến tính lưu trữ các phần tử theo cách tuần tự. Ví dụ bao gồm:
    • std::vector: Một mảng động phát triển và thu hẹp lại trong thời gian chạy.
      std::vector<int> my_vector;
    • std::list: Một danh sách liên kết đôi.
      std::list<int> my_list;
    • std::deque: Hàng đợi hai đầu cho phép chèn và xóa ở cả hai đầu.
      std::deque<int> my_deque;
  • Lưu trữ kết nối: Các vùng lưu trữ này lưu trữ dữ liệu theo cách được sắp xếp với các khóa duy nhất. Ví dụ bao gồm:
    • std::set: Một tập hợp các phần tử duy nhất được sắp xếp theo khóa.
      std::set<int> my_set;
    • std::map: Một tập hợp các cặp khóa-giá trị được sắp xếp theo khóa.
      std::map<std::string, int> my_map;
  • Lưu trữ kết nối ngẫu nhiên: Các vùng lưu trữ này lưu trữ dữ liệu theo cách ngẫu nhiên bằng cách sử dụng bảng băm. Ví dụ bao gồm:
    • std::unordered_set: Một tập hợp các phần tử duy nhất không theo thứ tự cụ thể.
      std::unordered_set<int> my_unordered_set;
    • std::unordered_map: Một tập hợp các cặp khóa-giá trị không theo thứ tự cụ thể.
      std::unordered_map<std::string, int> my_unordered_map;
  • Lưu trữ chuyển đổi tương thích dữ liệu: Đây là những vùng lưu trữ dựa trên các vùng lưu trữ hiện có khác. Ví dụ bao gồm:
    • std::stack: Cấu trúc dữ liệu LIFO dựa trên deque hoặc danh sách.
      std::stack<int> my_stack;
    • std::queue: Cấu trúc dữ liệu FIFO dựa trên deque hoặc danh sách
      std::queue<int> my_queue;
    • std::priority_queue: Một hàng đợi được sắp xếp dựa trên vector hoặc deque.
      std::priority_queue<int> my_priority_queue;

Thuật toán

STL cung cấp một số thuật toán chung có thể được sử dụng để thực hiện các thao tác khác nhau trên dữ liệu được lưu trữ trong các vùng lưu trữ. Chúng được chia thành năm loại: thuật toán trình tự không sửa đổi, thuật toán trình tự sửa đổi, thuật toán sắp xếp, thuật toán phạm vi được sắp xếp và thuật toán số. Một số ví dụ bao gồm std::find, std::replace, std::sort và std::binary_search. Ví dụ: để sắp xếp một vecto, bạn có thể sử dụng đoạn code sau:

std::vector<int> my_vec = {4, 2, 5, 1, 3};
std::sort(my_vec.begin(), my_vec.end());

Trình vòng lặp

Trình vòng lặp là một khái niệm cơ bản trong STL, vì chúng cung cấp một cách thống nhất để truy cập các phần tử trong vùng lưu trữ. Trình vòng lặp có thể được coi là một dạng con trỏ nâng cao. Mỗi vùng lưu trữ có loại trình vòng lặp riêng, có thể được sử dụng để duyệt qua các phần tử và sửa đổi giá trị. Các vòng lặp phổ biến nhất là begin() và end() để nhận các trình vòng lặp lần lượt trỏ đến phần tử đầu tiên và phần tử cuối cùng của vùng lưu trữ. Ví dụ: để lặp qua một vecto và in các phần tử của nó, bạn có thể sử dụng đoạn code sau:

std::vector<int> my_vec = {1, 2, 3, 4, 5};
for(auto it = my_vec.begin(); it != my_vec.end(); ++it) {
    std::cout << *it << " ";
}