Bạn cần hiểu cách hoạt động của từ điển. Từ điển chứa danh sách "nhóm băm" nơi các mục bạn chèn được đặt. Đó là một số hữu hạn, vì vậy một khi bạn điền vào nó, bạn cần phải phân bổ nhiều xô hơn, không có cách nào xung quanh nó. Vì việc gán các đối tượng vào các nhóm dựa trên kết quả của hàm băm, bạn không thể chỉ thêm các thùng vào cuối mảng và đặt các công cụ trong đó, bạn cần phân bổ lại toàn bộ danh sách các khối, tái băm tất cả mọi thứ và đặt nó trong (mới) tương ứng xô.
Với hành vi này, cách duy nhất để làm cho từ điển không cấp lại sau khi đã đầy đủ để đảm bảo nó không bao giờ bị đầy. Nếu bạn biết số lượng các mục bạn sẽ chèn vào trong từ điển, hãy chuyển nó thành một tham số cho hàm khởi tạo và bạn sẽ hoàn thành, không còn thêm các từ điển.
Nếu bạn không thể làm điều đó (bạn không biết số lượng các mục bạn sẽ có trong từ điển), bạn sẽ cần phải xem xét lại những gì khiến bạn chọn TDictionary
ở vị trí đầu tiên và chọn cấu trúc dữ liệu cung cấp sự thỏa hiệp tốt hơn cho thuật toán cụ thể của bạn. Ví dụ bạn có thể sử dụng cây tìm kiếm nhị phân, vì chúng làm cân bằng bằng cách xoay thông tin trong các nút hiện có, không cần phân bổ lại bao giờ.
Nguồn
2011-12-02 12:52:30
Tôi nghĩ giả định cơ bản là bạn không tiêu tốn một nửa toàn bộ tài nguyên có sẵn của bạn trong một cá thể 'TDictionary' duy nhất. Nó không được thiết kế để sử dụng như vậy. –
Vì vậy, đó sẽ là một "không, nó là không thể"? – jpfollenius
Khi bạn đã tiêu thụ được một nửa bộ nhớ, bạn làm cách nào để phân bổ lại. Giả sử bạn muốn thêm 10% khác. Bạn phải phân bổ một khối mới, lớn hơn 10% so với hiện tại. Sau đó sao chép từ cũ sang mới. Sau đó deallocate cũ. Điều đó sẽ không thành công. Nghe có vẻ kỳ lạ với tôi rằng một thùng chứa duy nhất có thể tiêu thụ hơn một nửa tài nguyên của bạn. –