std::unordered_set::reserve
#include <unordered_set>
void reserve(size_type count);
Yêu cầu std::unordered_set thay đổi capacity (sức chứa) của nó, tức là thay đổi số lượng phần tử mà std::unordered_set 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_set 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_set, 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_set 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_set (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_set. - 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_set, 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_set (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_set 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ể dẫn đến rehash.
Ví dụ
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> myset;
std::cout << "Initial bucket_count: " << myset.bucket_count() << '\n';
myset.reserve(100); // Yêu cầu capacity cho 100 phần tử
std::cout << "Bucket_count after reserve(100): " << myset.bucket_count() << '\n';
// Chèn thêm phần tử để thấy số bucket thay đổi
for (int i = 0; i < 50; ++i) {
myset.insert(i);
}
std::cout << "Bucket_count after adding 50 elements: " << myset.bucket_count() << '\n';
std::cout << "Load factor: " << myset.load_factor() << '\n';
std::cout << "Max load factor: " << myset.max_load_factor() << '\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_set 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_set |
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_set |
size | Trả về số lượng phần tử hiện có trong std::unordered_set |