2010-07-06 41 views
8

Tôi có một mảng động. Nhưng ban đầu tôi không biết chiều dài của mảng. Tôi có thể làm như đầu tiên tôi thiết lập độ dài của nó là 1 và sau đó tăng chiều dài như tôi cần mà không bị mất dữ liệu được lưu trữ trước đó?
Tôi biết tôi có thể thực hiện tác vụ đó bằng TList. Nhưng tôi muốn biết liệu tôi có thể làm điều đó với mảng hay không?Tôi có thể thay đổi kích thước một mảng Delphi mà không làm mất nội dung trước đó của nó không?

+0

Bạn đã đọc tài liệu về mảng động chưa? Bạn không hiểu phần nào của nó? –

Trả lời

15

Mảng động có thể được thay đổi kích thước thành kích thước lớn hơn mà không làm mất dữ liệu được chứa.

Chương trình sau đây thể hiện điều này đang hoạt động.

program Project7; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 
var 
A : Array of Integer; 
I : Integer; 
begin 
    for I := 0 to 19 do 
    begin 
    SetLength(A,I+1); 
    A[I] := I; 
    end; 
    for I := Low(A) to High(A) do 
    begin 
    writeln(A[I]); 
    end; 
    readln; 
end. 
+10

Chỉ cần nhận thức nó có thể là một hoạt động chuyên sâu bộ nhớ, bởi vì toàn bộ mảng có thể được di chuyển nếu không có đủ không gian để mở rộng nó, nơi nó được phân bổ. Một mảng, không giống như các danh sách, phải được cấp phát trong một khối bộ nhớ contiguos. Đó là lý do tại sao danh sách (và các thùng chứa khác) tồn tại. Sử dụng thùng chứa tốt nhất cho nhu cầu của bạn. –

+5

@ldsandon: Hãy cẩn thận: Nhiều "danh sách" trong Delphi được triển khai dưới dạng mảng hoặc ít nhất là khối bộ nhớ tiếp giáp theo cùng cách với mảng "dưới mui xe". TList, TObjectList, TStringList ... những danh sách thường gặp nhất là tất cả các mảng có hiệu quả bên trong trình bao bọc đối tượng. Tuy nhiên, "Độ dài" của các mảng "" này có các công cụ quản lý linh hoạt hơn các mảng "thực", vì chúng hỗ trợ cả Dung lượng (kích thước của "mảng") và Đếm (số phần tử thực sự được sử dụng) để bạn có thể phân bổ trước bộ nhớ tiếp giáp bạn cần (thông qua Dung lượng) trước khi điền. – Deltics

+1

Một điểm làm rõ mà bạn có thể đã biết. Tôi không biết nếu bất kỳ tối ưu hóa này sẽ quan trọng trên các máy hiện đại, nhưng ví dụ trên gọi SetLength() cho * mọi * yếu tố mới. Theo ghi chú bình luận của Idsandon, SetLength có thể là bộ nhớ chuyên sâu. Nếu đó là trường hợp, sau đó gọi SetLength() ít thường xuyên hơn có thể nhanh hơn. Ví dụ, bạn có thể gọi nó một lần mỗi 100 (hoặc thậm chí 1000) yếu tố. Tất nhiên, bạn phải theo dõi khi bạn cần gọi nó: nếu (Độ dài (A) <(I + 1) thì SetLength (A, I + 100); – RobertFrank

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