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

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

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 n nhỏ 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àmMục đíchHành vi
reserve(n)Đảm bảo chứa n phần tử KHÔNG rehashTăng bucket nếu cần: bucket_count ≥ n / max_load_factor()
rehash(n)Buộc bucket count ≥ nTă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_*.