là có thể khởi tạo kích thước STL map
?khởi tạo một kích thước bản đồ STL `
Tôi biết có bao nhiêu phần tử sẽ nằm trong bản đồ của tôi ở cuối và tôi muốn phân bổ tất cả bộ nhớ được yêu cầu ngay từ đầu.
là có thể khởi tạo kích thước STL map
?khởi tạo một kích thước bản đồ STL `
Tôi biết có bao nhiêu phần tử sẽ nằm trong bản đồ của tôi ở cuối và tôi muốn phân bổ tất cả bộ nhớ được yêu cầu ngay từ đầu.
Có một số lựa chọn:
Bạn có thể thử sử dụng bản đồ với cấp phát statefull. Ví dụ: Boost.Container hoặc từ C++ 11. Hoặc nếu bạn chấp nhận các giới hạn của các trình phân bổ không có trạng thái, thì bạn thậm chí có thể sử dụng bản đồ từ C++ 98/03.
Hãy xem xét sử dụng unordered_map (một lần nữa từ Boost hoặc từ C++ 11) - phải mất các nhóm được tính là tham số hàm tạo. Nó khác với bản đồ, trong đó nó được dựa trên băm chứ không phải là thứ tự yếu nghiêm ngặt.
Tùy chọn khác là flat_map từ Boost. Nó có dự trữ chức năng thành viên. Description của phẳng bản đồ/thiết lập:
container kết hợp Boost.Container flat_ [multi] bản đồ/bộ container được sắp xếp vector dựa trên cơ sở Austern và hướng dẫn Alexandrescu của
Lựa chọn nào tốt hơn - phụ thuộc vào các mẫu sử dụng của bạn.
+1 cho flat_map. – ildjarn
Bạn không thể. Đó là một cái cây (thường là một cây đỏ đen). Các giá trị thực tế sẽ xác định bố cục bộ nhớ.
Tuy nhiên, bạn thể
sử dụng Boost Intrusive bản đồ (mà sử dụng yếu tố mà bạn phân bổ vào bình chứa khác, như một vector), được trang trí với 'móc' để thực hiện các chức năng bản đồ trên nó
sử dụng std :: bản đồ với người phân bổ, vì vậy bạn có thể phân bổ tất cả các phần tử thực tế từ một 'hồ bơi' cố định (vùng bộ nhớ)
reserve
có thể được mô phỏng bằng rehash
như trong Bảng 103 trong N3376.
a.rehash(n)
Post: a.bucket_count() > a.size()/a.max_load_factor()
and a.bucket_count() >= n.
a.reserve(n) Same as a.rehash(ceil(n/a.max_load_factor()))
Đó là cho 'std :: unordered_map <>', không phải 'std :: map <>'. – ildjarn
Điều duy nhất tôi có thể nghĩ đến là phải sử dụng nhà thầu iterator của nó. Bí quyết duy nhất là sau đó bạn phải tạo một vùng chứa khác với kích thước bạn cần và cung cấp cho trình vòng lặp của nó cho hàm tạo.
Bạn sử dụng mẫu sử dụng nào? Bạn có bất kỳ xóa nào không? Hoặc nó chỉ là điền ban đầu, và sau đó sử dụng mà không thay đổi? –
Tôi cần khởi tạo với số không và sau đó tăng. – MBZ