STL Nâng Cao
1. unordered_map / unordered_set
- Ưu điểm: Tìm kiếm trung bình O(1), nhanh hơn map khi không cần thứ tự.
- Nhược điểm: Không duy trì thứ tự, tiêu tốn bộ nhớ hơn
map/set.
- Nên dùng: Khi cần tra cứu nhanh, không quan tâm đến thứ tự.
2. set / multiset / map / multimap
- set/map: Không chứa phần tử trùng lặp.
- multiset/multimap: Cho phép nhiều phần tử trùng.
- Giữ thứ tự phần tử (dựa trên comparator).
- Nên dùng khi cần duy trì thứ tự hoặc tránh phần tử trùng.
3. priority_queue / heap
- Là max-heap mặc định (ưu tiên giá trị lớn nhất).
- Có thể dùng comparator để biến thành min-heap hoặc custom logic.
- Dùng cho: Dijkstra, A*, top-k,...
- Không duyệt được toàn bộ phần tử, chỉ truy cập phần tử đầu.
4. stack / queue / deque
stack: LIFO (Last In First Out)
queue: FIFO (First In First Out)
deque: Double-ended queue – chèn/xoá ở cả hai đầu.
- Deque thay
vector/list khi cần chèn ở đầu hoặc cuối hiệu quả.
5. vector vs list
- vector: Truy cập nhanh, bộ nhớ liên tục, chèn xoá cuối hiệu quả.
- list: Tốt cho chèn/xoá giữa, nhưng chậm và tốn bộ nhớ.
- Nên dùng
vector mặc định, chỉ dùng list khi thực sự cần.
6. Thuật toán STL
std::transform: Biến đổi từng phần tử (ví dụ: x2, lowercase...)
std::for_each: Duyệt và xử lý phần tử (in ra màn hình,...)
std::accumulate: Tính tổng, nối chuỗi,...
7. C++20 Ranges
- Dễ viết pipeline với
views::filter, views::transform, views::take_while.
- An toàn hơn so với iterator thủ công, rõ ràng và ngắn gọn.
8. Custom Comparator
- Dùng
struct hoặc lambda để định nghĩa tiêu chí sắp xếp riêng.
- Ứng dụng trong
sort, set/map, priority_queue.
9. Iterator nâng cao
- reverse_iterator: Duyệt ngược.
- insert_iterator: Chèn phần tử qua thuật toán (vd: copy).
- istream_iterator / ostream_iterator: Duyệt dữ liệu từ/ra stream.
Lưu ý hiệu suất & bộ nhớ
- So sánh độ phức tạp Big-O khi chọn container.
- Dùng
emplace thay vì insert để tránh copy.
- Không nên copy container lớn không cần thiết.
#include
#include
#include
#include
#include
std::unordered_map dict = {{1, "A"}, {2, "B"}};
std::set s = {3, 1, 4};
std::priority_queue pq;
pq.push(5); pq.push(2);
std::vector v = {1, 3, 2};
std::sort(v.begin(), v.end());
std::transform(v.begin(), v.end(), v.begin(), [](int x){ return x * 2; });
// C++20 Ranges
for (int x : v | std::ranges::views::filter([](int i){ return i > 2; })) {
std::cout << x << " ";
}