Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm unordered_multimap::rehash() trong C++ STL

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ên max_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ế

  1. Tối ưu chèn hàng loạt: m.rehash(expected_size / max_load_factor()); trước vòng lặp chèn.
  2. Điều chỉnh load factor: m.max_load_factor(0.7); m.rehash(m.size() / 0.7);.
  3. 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: reserve và rehash đảm bảo không ném exception nếu allocator không ném.