我有一個動態數組。但最初我不知道數組的長度。我可以像第一個那樣做,我把它的長度設置爲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. 調整大小,而不會丟失其質量iphone
- 2. GridBaglyout填充不會調整容器內的組件的大小
- 3. ExtJS 4 - 調整大小後調整大小後調整大小的內部組件不會調整大小resizeHandles
- 4. 調整圖像大小而不丟失EXIF數據?
- 5. QLayout可以隱藏而不是調整QWidgets的大小嗎?
- 6. 使用.NET調整圖像大小而不會丟失EXIF數據
- 7. 爲什麼我可以將整數範圍「摺疊」成一半的大小而不會丟失信息?
- 8. 調整大小的PNG而不會丟失質量和透明度
- 9. 我們可以像調整窗口大小一樣調整Datagridview的大小嗎?
- 10. UIWebView將不會調整大小以適應內容?
- 11. Rails,鏈接到前一頁,而不會丟失內容
- 12. 調整圖像大小JavaScript/jQuery不會丟失質量
- 13. 調整UIView框架的大小會導致內容調整大小
- 14. 是否可以在不丟失質量的情況下調整UIImage大小?
- 15. 在用戶放開鼠標按鈕之前,我可以讓窗口不會調整大小嗎?
- 16. 新的wxpython控件在調整大小之前不會顯示
- 17. 單獨的輸入框不會調整大小而不需要調整大小
- 18. 我可以使數組的內容全部小寫嗎?
- 19. 如何推入服務而不會丟失以前的數據?
- 20. JScrollpane調整可變大小內容的大小
- 21. 調整內容大小調整餅圖
- 22. Iframe調整大小調整內容
- 23. 當窗口變小時ListBox內容不會調整大小
- 24. MPMoviePlayer可以調整動畫大小嗎?
- 25. YUI的DataTable可以調整大小但不可移動列嗎?
- 26. jQuery的可調整大小不工作ajaxically加載的內容
- 27. 調整瀏覽器中的內容調整大小而不彎曲
- 28. AS3:調整精靈的大小而不調整其BitmapFill(或其內容)?
- 29. 我可以針對不同的數據庫以不同的方式調整內存緩存大小嗎?
- 30. 內容容器沒有調整大小以適合內容
您是否閱讀過關於動態數組的文檔?你不明白哪部分? – 2010-07-06 15:34:09