std::unordered_map::reserve
#include <unordered_map>
void reserve(size_type count);
Yêu cầu std::unordered_map thay đổi capacity (sức chứa) của nó, tức là thay đổi số lượng phần tử mà std::unordered_map có thể chứa mà không cần phải rehash.
Tham số
count
- Số lượng phần tử tối thiểu mà bạn muốn std::unordered_map có thể chứa mà không cần rehash.
Giá trị trả về
Không có giá trị trả về
Đặc điểm
- Thay đổi capacity:
reserve()
thay đổi capacity (sức chứa) của std::unordered_map, tức là số lượng phần tử tối đa mà nó có thể chứa mà không cần rehash. - Có thể dẫn đến rehashing: Nếu
count
lớn hơnbucket_count() * max_load_factor()
hiện tại, việc gọireserve()
sẽ dẫn đến rehashing. - Không đảm bảo capacity chính xác:
reserve()
chỉ yêu cầu capacity, std::unordered_map có thể cấp phát nhiều hơncount
nếu cần. - Không ảnh hưởng đến
size()
:reserve()
không thay đổi số lượng phần tử hiện có trong std::unordered_map (tức là không thay đổi giá trị trả về bởisize()
). - Có thể làm thay đổi iterator: Nếu việc gọi
reserve()
dẫn đến rehash, nó có thể làm thay đổi (invalidate) tất cả các iterator đang trỏ đến các phần tử trong std::unordered_map. - Nên gọi trước khi chèn nhiều phần tử: Nếu bạn biết trước số lượng phần tử mà bạn sẽ chèn vào std::unordered_map, bạn nên gọi
reserve()
trước khi chèn để tránh việc rehashing tự động xảy ra nhiều lần trong quá trình chèn, tối ưu hiệu suất. - Có thể ném ngoại lệ: Nếu việc cấp phát bộ nhớ thất bại,
reserve()
có thể ném ra ngoại lệ std::bad_alloc. Ngoài ra, nếu hash function hoặc equal function ném ngoại lệ khi rehash,reserve()
cũng sẽ ném ngoại lệ. - Độ phức tạp: Độ phức tạp của
reserve()
làO(n)
, với n là số phần tử trong std::unordered_map (do phải thực hiện rehash nếu cần).
Phân biệt với rehash()
- rehash(n): Thiết lập số lượng bucket ít nhất là n.
- reserve(n): Yêu cầu std::unordered_map cấp phát đủ bộ nhớ để chứa ít nhất n phần tử mà không cần phải rehash.
reserve()
có thể làm thay đổi số lượng bucket (thông qua rehash).
Ví dụ
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, int> myumap;
std::cout << "Initial bucket_count: " << myumap.bucket_count() << '\n';
myumap.reserve(100); // Yêu cầu capacity cho 100 phần tử
std::cout << "Bucket_count after reserve(100): " << myumap.bucket_count() << '\n';
// Chèn thêm phần tử để thấy số bucket thay đổi
for (int i = 0; i < 50; ++i) {
myumap.emplace(i, i);
}
std::cout << "Bucket_count after adding 50 elements: " << myumap.bucket_count() << '\n';
std::cout << "Load factor: " << myumap.load_factor() << '\n';
std::cout << "Max load factor: " << myumap.max_load_factor() << '\n';
std::cout << "Size: " << myumap.size() << '\n';
return 0;
}
Các hàm liên quan
rehash | Thiết lập số lượng bucket trong bảng băm của std::unordered_map thành ít nhất count |
bucket_count | Trả về số lượng bucket (hay còn gọi là giỏ) hiện tại trong std::unordered_map |
max_load_factor | Truy vấn hoặc thiết lập hệ số tải tối đa (maximum load factor) của std::unordered_map |
size | Trả về số lượng phần tử hiện có trong std::unordered_map |