unordered_multimap::reserve(n) (C++11) yêu cầu container chuẩn bị đủ bucket để chứa ít nhất n phần tử mà không cần rehash. Giúp tránh rehash nhiều lần khi chèn hàng loạt.
Đặc điểm
- Tham số:
size_type n– số phần tử dự kiến. - Trả về:
void. - Nếu
n > bucket_count() * max_load_factor()→ tăng bucket count và rehash. - Nếu
nnhỏ hơn hiện tại → không làm gì (không shrink). - Không thay đổi
size()(số phần tử thực).
Ví dụ
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_multimap<char, int> m;
cout << "Initial buckets: " << m.bucket_count() << endl;
m.reserve(1000); // dự kiến 1000 phần tử
cout << "After reserve(1000): buckets = " << m.bucket_count()
<< ", load_factor = " << m.load_factor() << endl;
for (int i = 0; i < 1000; ++i)
m.emplace('a' + i % 26, i);
cout << "After insert 1000: size = " << m.size()
<< ", buckets = " << m.bucket_count()
<< ", load_factor = " << m.load_factor() << endl;
return 0;
}
Kết quả mẫu (tùy implementation)
Initial buckets: 1 After reserve(1000): buckets = 1024, load_factor = 0 After insert 1000: size = 1000, buckets = 1024, load_factor = 0.976
reserve() vs rehash()
| Hàm | Mục đích | Hành vi |
|---|---|---|
reserve(n) | Đảm bảo chứa n phần tử KHÔNG rehash | Tăng bucket nếu cần: bucket_count ≥ n / max_load_factor() |
rehash(n) | Buộc bucket count ≥ n | Tăng bucket nếu bucket_count < n; không giảm |
reserve(1000) ≈ rehash(ceil(1000 / max_load_factor())).
Khi nào dùng?
- Biết trước số lượng phần tử sẽ chèn (đọc file, parse data, copy từ container khác).
- Tránh chi phí rehash nhiều lần – cải thiện hiệu năng chèn hàng loạt.
- Không dùng để "shrink" bộ nhớ – unordered_map không hỗ trợ shrink_to_fit (C++11). C++23 có
shrink_to_fit()cho vector/string, chưa có cho unordered_*.