我有一個動態數組。但最初我不知道數組的長度。我可以像第一個那樣做,我把它的長度設置爲1,然後根據需要增加長度而不丟失之前存儲的數據?
我知道我可以使用TList來完成這樣的任務。但我想知道我是否可以用數組來完成它?我可以調整Delphi數組的大小而不會丟失之前的內容嗎?
回答
動態數組可以調整到更大的大小,而不會丟失包含的數據。
以下程序演示了此操作。
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.
請注意它可能是一個內存密集型操作,因爲如果沒有足夠的空間來擴展它分配的位置,整個數組可能會被移動。與列表不同,數組必須分配在contiguos內存塊中。這就是列表(和其他容器)存在的原因。爲您的需要使用最好的容器。 – 2010-07-06 08:28:37
@ldsandon:小心:Delphi中的許多「列表」都以數組或至少連續的內存塊的形式實現,其方式與「底層」數組完全相同。 TList,TObjectList,TStringList ...這些最常遇到的列表都是對象包裝中的有效數組。然而,這些「數組」的「長度」比「真實」數組擁有更靈活的管理工具,因爲它們同時支持容量(「數組」的大小)和計數(實際使用的元素的數量),因此您可以預先分配在填充之前您需要的連續內存(通過容量)。 – Deltics 2010-07-06 21:06:40
您可能已經知道的一點澄清。我不知道在現代機器上是否有任何優化問題,但上面的例子爲* 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
- 1. 圖像調整大小而不會丟失Exif數據?
- 2. 禁用gif調整大小或調整大小而不會丟失動畫
- 3. 調整GLUT窗口的大小而不調整內容大小?
- 4. 重新調整圖像的大小而不會丟失質量
- 5. 調整大小,而不會丟失其質量iphone
- 6. 調整圖像大小,而不會丟失質量
- 7. Delphi可以讓用戶調整TStringGrid列的大小而不固定行嗎?
- 8. GridBaglyout填充不會調整容器內的組件的大小
- 9. ExtJS 4 - 調整大小後調整大小後調整大小的內部組件不會調整大小resizeHandles
- 10. 調整圖像大小而不丟失EXIF數據?
- 11. Fieldset在調整內部內容時不會調整大小
- 12. QLayout可以隱藏而不是調整QWidgets的大小嗎?
- 13. CSS可調整大小的內容
- 14. 使用.NET調整圖像大小而不會丟失EXIF數據
- 15. 調整窗口大小不會調整tkinter中的內容大小
- 16. 爲什麼我可以將整數範圍「摺疊」成一半的大小而不會丟失信息?
- 17. 調整大小的PNG而不會丟失質量和透明度
- 18. 我們可以像調整窗口大小一樣調整Datagridview的大小嗎?
- 19. MyDoggy:調整窗口大小而不是底部ToolWindow時調整內容大小?
- 20. UIWebView將不會調整大小以適應內容?
- 21. Rails,鏈接到前一頁,而不會丟失內容
- 22. 如何調整JavaFX ScrollPane內容的大小以適合當前的大小
- 23. 調整圖像大小JavaScript/jQuery不會丟失質量
- 24. 調整大小和組內容網格
- 25. jQuery函數在調整窗口大小之前不會觸發
- 26. 調整圖像的大小而不會損失縱橫比
- 27. 如何根據縱橫比調整圖像大小而不會丟失質量?
- 28. 調整UIView框架的大小會導致內容調整大小
- 29. 在用戶放開鼠標按鈕之前,我可以讓窗口不會調整大小嗎?
- 30. 我可以使數組的內容全部小寫嗎?
您是否閱讀過關於動態數組的文檔?你不明白哪部分? – 2010-07-06 15:34:09