2012-11-09 36 views
8

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.

+1

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? –

+0

Tôi cần khởi tạo với số không và sau đó tăng. – MBZ

Trả lời

6

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

  • Hoặc, nếu boost không có sẵn - thì bạn có thể đơn giản sử dụng std :: vector + std :: sort + std :: lower_bound (hoặc quấn chúng thành flat_map nhỏ như class). I E. chỉ cần đặt các phần tử của bạn vào vectơ (không theo thứ tự), sau đó sắp xếp nó, và sau đó - khi bạn cần truy vấn phần tử theo khóa - chỉ cần sử dụng lower_bound.

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

+1 cho flat_map. – ildjarn

4

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ớ)

0

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())) 

Source

+3

Đó là cho 'std :: unordered_map <>', không phải 'std :: map <>'. – ildjarn

1

Đ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.

Các vấn đề liên quan