Mục tiêu tiết học:
- Hiểu STL là gì và tại sao nó cực mạnh.
- Làm quen với các cấu trúc dữ liệu hiện đại:
pair– cặp dữ liệumap– ánh xạ khóa → giá trịset– tập hợp không trùngunordered_map,unordered_set– siêu nhanh nhờ bảng bămtuple– nhóm dữ liệu nhiều phần tử
- Ứng dụng: Thống kê và sắp xếp dữ liệu trong thực tế.
1. STL là gì?
STL (Standard Template Library) là thư viện cấu trúc dữ liệu và thuật toán sẵn có của C++, giúp bạn tiết kiệm hàng trăm dòng code.
- Containers (cấu trúc dữ liệu) →
vector,map,set,queue,stack,list, ... - Algorithms (thuật toán) →
sort(),find(),count(), ... - Iterators (bộ lặp) → truy cập dữ liệu trong container.
2. pair – Lưu hai giá trị liên quan
Mã:
#include <iostream>
#include <utility> // chứa pair
using namespace std;
int main() {
pair<string, int> player = {"Huy", 1500};
cout << "Ten: " << player.first << endl;
cout << "Diem: " << player.second << endl;
}
Dùng để lưu “tên + điểm”, “ID + giá trị”, “tọa độ x,y”...
3. map – Từ điển có thứ tự (key → value)
mapsắp xếp tự động theo khóa, không trùng khóa.
Mã:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> score;
score["Huy"] = 90;
score["Linh"] = 85;
score["Khang"] = 95;
for (auto p : score) {
cout << p.first << ": " << p.second << endl;
}
}
Mã:
Huy: 90
Khang: 95
Linh: 85
| Hàm | Tác dụng |
|---|---|
score[key] | Truy cập hoặc thêm phần tử |
erase(key) | Xóa phần tử |
count(key) | Kiểm tra tồn tại |
size() | Số phần tử |
clear() | Xóa tất cả |
4. set – Tập hợp không trùng lặp, tự sắp xếp
Mã:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> nums = {5, 2, 2, 9, 1};
nums.insert(3);
nums.erase(9);
for (int x : nums) cout << x << " ";
}
Mã:
1 2 3 5
- Mỗi phần tử chỉ xuất hiện 1 lần.
- Tự động sắp xếp tăng dần.
5. unordered_map và unordered_set
Giốngmap/setnhưng không sắp xếp, đổi lại tốc độ tìm kiếm cực nhanh (O(1)).
Mã:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> age = {
{"Huy", 18},
{"Linh", 19},
{"An", 17}
};
cout << "Tuoi cua Linh: " << age["Linh"] << endl;
}
unordered_map?- Khi bạn cần truy xuất siêu nhanh.
- Không cần dữ liệu được sắp xếp.
6. tuple – Gói nhiều giá trị khác kiểu
Mã:
#include <iostream>
#include <tuple>
using namespace std;
int main() {
tuple<string, int, double> student("Huy", 18, 9.5);
cout << get<0>(student) << " - Tuoi: " << get<1>(student)
<< " - Diem: " << get<2>(student) << endl;
}
Dùng khi bạn muốn trả về nhiều giá trị từ một hàm, ví dụ:
Mã:
tuple<int,int,int> RGB() { return {255,128,64}; }
7. Bài tập thực tế: Thống kê điểm học sinh
Mã:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
map<string, int> score = {
{"Huy", 90}, {"Linh", 85}, {"An", 95}, {"Khang", 75}
};
vector<pair<string, int>> arr(score.begin(), score.end());
sort(arr.begin(), arr.end(),
[](auto &a, auto &b) { return a.second > b.second; });
cout << "BANG XEP HANG DIEM:\n";
for (auto &p : arr)
cout << p.first << " - " << p.second << endl;
}
Mã:
An - 95
Huy - 90
Linh - 85
Khang - 75
TỔNG KẾT TIẾT 15
| Cấu trúc | Dữ liệu | Đặc điểm |
|---|---|---|
pair | 2 giá trị | Dễ dùng cho key-value nhỏ |
map | key → value | Có thứ tự, không trùng khóa |
set | Tập hợp | Không trùng, tự sắp xếp |
unordered_map | key → value | Không sắp xếp, nhanh |
tuple | Nhiều giá trị khác kiểu | Dùng để trả nhiều kết quả |
