std::set và std::map đều là container liên kết (red-black tree), giữ phần tử đã sắp xếp, duy nhất. Khác biệt cốt lõi: set lưu key, map lưu cặp key-value.
Bảng so sánh nhanh
| Đặc điểm | std::set<Key> | std::map<Key, Value> |
| Phần tử | Key (duy nhất) | Pair<Key, Value> (key duy nhất) |
| Truy cập giá trị | Chỉ key | map[key] (tạo nếu chưa có), at(key) (throw nếu không có) |
| Iterator deref | *it → Key | *it → Pair<const Key, Value> (it->first, it->second) |
| Chèn | insert(key) | insert({key, val}), emplace(key, val) |
| Tìm kiếm | find(key) → iterator | find(key) → iterator đến pair |
| Độ phức tạp | O(log n) tất cả | O(log n) tất cả |
| Sắp xếp | Theo Key (less<Key> mặc định) | Theo Key (less<Key> mặc định) |
Ví dụ Set
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s = {7, 6, 1, 4, 2, 9, 10};
cout << "Set elements: ";
for (int x : s) cout << x << ' '; // 1 2 4 6 7 9 10
cout << endl;
return 0;
}
Ví dụ Map
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> m;
m["Alice"] = 25;
m["Bob"] = 30;
m.emplace("Charlie", 35);
cout << "Map elements:\n";
for (auto& [k, v] : m) // C++17 structured binding
cout << k << " -> " << v << '\n';
// Truy cập
cout << "Alice age: " << m.at("Alice") << endl; // 25
// m["David"] = 40; // tự tạo nếu chưa có
return 0;
}
Kết quả Map
Map elements:
Alice -> 25
Bob -> 30
Charlie -> 35
Alice age: 25
Các biến thể (C++11)
| Container | Key duy nhất? | Sắp xếp? | Cấu trúc |
set | Có | Có | Tree |
multiset | Không (cho phép trùng) | Có | Tree |
unordered_set | Có | Không (hash) | Hash table |
unordered_multiset | Không | Không | Hash table |
map | Có | Có | Tree |
multimap | Không | Có | Tree |
unordered_map | Có | Không | Hash table |
unordered_multimap | Không | Không | Hash table |
Chọn cái nào?
- Chỉ cần tập hợp key duy nhất, cần thứ tự →
set.
- Cần ánh xạ key → value, key duy nhất →
map.
- Cho phép key trùng →
multiset/multimap.
- Không cần thứ tự, cần O(1) trung bình →
unordered_set/unordered_map.
- Cần thứ tự + tìm kiếm nhanh →
set/map (tree).