2010-07-06 6 views
8

我有一個動態數組。但最初我不知道數組的長度。我可以像第一個那樣做,我把它的長度設置爲1,然後根據需要增加長度而不丟失之前存儲的數據?
我知道我可以使用TList來完成這樣的任務。但我想知道我是否可以用數組來完成它?我可以調整Delphi數組的大小而不會丟失之前的內容嗎?

+0

您是否閱讀過關於動態數組的文檔?你不明白哪部分? – 2010-07-06 15:34:09

回答

15

動態數組可以調整到更大的大小,而不會丟失包含的數據。

以下程序演示了此操作。

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

請注意它可能是一個內存密集型操作,因爲如果沒有足夠的空間來擴展它分配的位置,整個數組可能會被移動。與列表不同,數組必須分配在contiguos內存塊中。這就是列表(和其他容器)存在的原因。爲您的需要使用最好的容器。 – 2010-07-06 08:28:37

+5

@ldsandon:小心:Delphi中的許多「列表」都以數組或至少連續的內存塊的形式實現,其方式與「底層」數組完全相同。 TList,TObjectList,TStringList ...這些最常遇到的列表都是對象包裝中的有效數組。然而,這些「數組」的「長度」比「真實」數組擁有更靈活的管理工具,因爲它們同時支持容量(「數組」的大小)和計數(實際使用的元素的數量),因此您可以預先分配在填充之前您需要的連續內存(通過容量)。 – Deltics 2010-07-06 21:06:40

+1

您可能已經知道的一點澄清。我不知道在現代機器上是否有任何優化問題,但上面的例子爲* every * new元素調用SetLength()。正如Idsandon的評論所指出的,SetLength可能會佔用大量內存。如果是這種情況,那麼較少調用SetLength()可能會更快。例如,您可以每100(甚至1000)個元素調用一次。當然,你需要跟蹤何時需要調用它: if(Length(A)<(I + 1)then SetLength(A,I + 100); – RobertFrank 2010-07-07 03:36:33

相關問題