Chuyển tới nội dung chính

std::unordered_multiset::reserve

#include <unordered_set>

void reserve(size_type count);

Yêu cầu std::unordered_multiset thay đổi capacity (sức chứa) của nó, tức là thay đổi số lượng phần tử mà std::unordered_multiset 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_multiset có thể chứa mà không cần rehash.

Giá trị trả về

Không có giá trị trả về

Đặc điểm

  1. Thay đổi capacity: reserve() thay đổi capacity (sức chứa) của std::unordered_multiset, tức là số lượng phần tử tối đa mà nó có thể chứa mà không cần rehash.
  2. Có thể dẫn đến rehashing: Nếu count lớn hơn bucket_count() * max_load_factor() hiện tại, việc gọi reserve() sẽ dẫn đến rehashing.
  3. Không đảm bảo capacity chính xác: reserve() chỉ yêu cầu capacity, std::unordered_multiset có thể cấp phát nhiều hơn count nếu cần.
  4. Không ảnh hưởng đến size(): reserve() không thay đổi số lượng phần tử hiện có trong std::unordered_multiset (tức là không thay đổi giá trị trả về bởi size()).
  5. 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_multiset.
  6. 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_multiset, 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.
  7. 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ệ.
  8. Độ phức tạp: Độ phức tạp của reserve()O(n), với n là số phần tử trong std::unordered_multiset (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_multiset 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_multiset<int> myumset;

std::cout << "Initial bucket_count: " << myumset.bucket_count() << '\n';

myumset.reserve(100); // Yêu cầu capacity cho 100 phần tử

std::cout << "Bucket_count after reserve(100): " << myumset.bucket_count() << '\n';

// Chèn thêm phần tử để thấy số bucket thay đổi
for (int i = 0; i < 50; ++i) {
myumset.insert(i);
}

std::cout << "Bucket_count after adding 50 elements: " << myumset.bucket_count() << '\n';
std::cout << "Load factor: " << myumset.load_factor() << '\n';
std::cout << "Max load factor: " << myumset.max_load_factor() << '\n';

return 0;
}

Các hàm liên quan

rehashThiết lập số lượng bucket trong bảng băm của std::unordered_multiset thành ít nhất count
bucket_countTrả về số lượng bucket (hay còn gọi là giỏ) hiện tại trong std::unordered_multiset
max_load_factorTruy vấn hoặc thiết lập hệ số tải tối đa (maximum load factor) của std::unordered_multiset
sizeTrả về số lượng phần tử hiện có trong std::unordered_multiset