unordered_multimap::rehash(n) (C++11) đặt số bucket tối thiểu là n. Nếu n > bucket_count() → tăng bucket và buộc rehash (tính lại hash, phân phối lại phần tử). Nếu n ≤ bucket_count() → không làm gì (không shrink).
Đặc điểm
- Tham số:
size_type n– số bucket tối thiểu. - Trả về:
void. - Iterator, pointer, reference bị invalidated sau rehash.
- Không thay đổi
size().
Ví dụ
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_multimap<char, int> m;
cout << "Initial buckets: " << m.bucket_count() << endl; // thường 1
m.rehash(10); // buộc ít nhất 10 bucket
cout << "After rehash(10): buckets = " << m.bucket_count() << endl;
m.emplace('b', 10);
m.emplace('a', 20);
cout << "Size: " << m.size() << endl;
for (auto& p : m) cout << "{" << p.first << "," << p.second << "} ";
cout << endl;
return 0;
}
Kết quả mẫu
Initial buckets: 1
After rehash(10): buckets = 10
Size: 2
{a,20} {b,10}
rehash() vs reserve()
reserve(n): "Tôi sẽ chèn n phần tử, hãy chuẩn bị bucket đủ" – tính bucket dựa trênmax_load_factor().rehash(n): "Tôi muốn bucket count ≥ n ngay lập tức" – kiểm soát trực tiếp bucket count.
Ứng dụng thực tế
- Tối ưu chèn hàng loạt:
m.rehash(expected_size / max_load_factor());trước vòng lặp chèn. - Điều chỉnh load factor:
m.max_load_factor(0.7); m.rehash(m.size() / 0.7);. - Debug/Profile: quan sát bucket distribution
m.bucket_size(i).
Lưu ý
- Không dùng
rehash(0)để shrink – standard không yêu cầu shrink. - Rehash tốn O(N) – chỉ gọi khi cần thiết.
- C++17:
reservevàrehashđảm bảo không ném exception nếu allocator không ném.