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

std::unordered_map::max_load_factor

#include <unordered_map>

// Phiên bản 1: Lấy hệ số tải tối đa hiện tại
float max_load_factor() const noexcept;

// Phiên bản 2: Thiết lập hệ số tải tối đa mới
void max_load_factor(float z);

Truy vấn hoặc thiết lập hệ số tải tối đa (maximum load factor) của std::unordered_map. Hệ số tải tối đa là ngưỡng mà khi hệ số tải hiện tại (số phần tử / số bucket) vượt quá, std::unordered_map sẽ tự động tăng số lượng bucket (rehashing) để duy trì hiệu suất.

Tham số

z

  • Hệ số tải tối đa mới (phiên bản 2). Giá trị này phải lớn hơn 0.

Giá trị trả về

float

  • Phiên bản 1 (không tham số):
    • float: Trả về hệ số tải tối đa hiện tại của std::unordered_map.
  • Phiên bản 2 (z):
    • void: Không trả về giá trị nào.

Đặc điểm

  1. Kiểm soát rehashing: Hệ số tải tối đa ảnh hưởng đến tần suất rehashing (tăng số lượng bucket) của std::unordered_map. Khi hệ số tải hiện tại vượt quá max_load_factor(), std::unordered_map sẽ tự động rehash.
  2. Mặc định là 1.0: Giá trị mặc định của max_load_factor() thường là 1.0.
  3. Ảnh hưởng đến hiệu suất và bộ nhớ:
    • Hệ số tải tối đa thấp hơn dẫn đến việc rehash thường xuyên hơn, tốn nhiều bộ nhớ hơn nhưng giảm khả năng đụng độ và cải thiện hiệu suất tìm kiếm, chèn, xóa trong trường hợp trung bình.
    • Hệ số tải tối đa cao hơn dẫn đến việc rehash ít thường xuyên hơn, tiết kiệm bộ nhớ hơn nhưng có thể tăng khả năng đụng độ và làm giảm hiệu suất trong trường hợp xấu nhất.
  4. noexcept: Phiên bản const của max_load_factor() (phiên bản 1) được đánh dấu là noexcept, nghĩa là nó được đảm bảo không ném ra ngoại lệ nào.
  5. Thay đổi max_load_factor() không làm thay đổi ngay lập tức: Việc thay đổi max_load_factor() không làm thay đổi ngay lập tức số lượng bucket. Việc rehash chỉ xảy ra khi số lượng phần tử thay đổi và hệ số tải hiện tại vượt quá ngưỡng mới.
  6. Nên thiết lập trước khi chèn nhiều phần tử: Nếu bạn biết trước số lượng phần tử ước tính, bạn có thể thiết lập max_load_factor() phù hợp trước khi chèn các phần tử để tối ưu hóa hiệu suất.
  7. Có thể gây ra rehash: Khi max_load_factor() bị thay đổi, nếu bucket_count * new_max_load_factor < size, rehash() sẽ được gọi.
  8. Độ phức tạp: O(1) - thời gian hằng số.

Ví dụ

#include <iostream>
#include <unordered_map>

int main() {
std::unordered_map<int, int> myumap;

// Lấy hệ số tải tối đa hiện tại
std::cout << "Current max_load_factor: " << myumap.max_load_factor() << '\n'; // Output: Current max_load_factor: 1 (giá trị mặc định thường là 1.0)

// Thiết lập hệ số tải tối đa mới
myumap.max_load_factor(0.7f);

std::cout << "New max_load_factor: " << myumap.max_load_factor() << '\n'; // Output: New max_load_factor: 0.7

return 0;
}

Các hàm liên quan

load_factorTrả về hệ số tải (load factor) hiện tại của std::unordered_map
bucket_sizeTrả về số lượng phần tử hiện có trong một bucket cụ thể
bucket_countTrả về số lượng bucket (hay còn gọi là giỏ) hiện tại trong std::unordered_map
sizeTrả về số lượng phần tử hiện có trong std::unordered_map