我可以调整Delphi数组的大小而不丢失它以前的内容吗?

我可以调整Delphi数组的大小而不丢失它以前的内容吗?,delphi,dynamic-arrays,Delphi,Dynamic Arrays,我有一个动态数组。但最初我不知道数组的长度。我可以先将其长度设置为1,然后根据需要增加长度而不丢失以前存储的数据吗? 我知道我可以用TList完成这样的任务。但是我想知道我是否可以用数组来完成它?动态数组可以调整到更大的大小,而不会丢失包含的数据 下面的程序演示了这一点 program Project7; {$APPTYPE CONSOLE} uses SysUtils; var A : Array of Integer; I : Integer; begin for I :=

我有一个动态数组。但最初我不知道数组的长度。我可以先将其长度设置为1,然后根据需要增加长度而不丢失以前存储的数据吗?

我知道我可以用TList完成这样的任务。但是我想知道我是否可以用数组来完成它?

动态数组可以调整到更大的大小,而不会丢失包含的数据

下面的程序演示了这一点

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.

请注意,这可能是一个内存密集型操作,因为如果没有足够的空间将整个阵列扩展到分配的位置,整个阵列可能会被移动。与列表不同,数组必须在一个连续的内存块中分配。这就是列表(和其他容器)存在的原因。根据您的需要使用最好的容器。@ldsandon:小心:Delphi中的许多“列表”都是以数组或至少连续的内存块的方式实现的,与“引擎盖下”的数组完全相同。TList,TObjectList,TStringList。。。这些最常见的列表实际上都是对象包装器中的数组。然而,这些“数组”的“长度”比“真实”数组具有更灵活的管理工具,因为它们同时支持容量(“数组”的大小)和计数(实际使用的元素数),所以您可以在填充之前预先分配所需的连续内存(通过容量)。您可能已经知道一点需要澄清的地方。我不知道这些优化在现代机器上是否重要,但上面的示例为每个新元素调用SetLength()。正如Idsandon的评论所指出的,SetLength可能会占用大量内存。如果是这样的话,那么调用SetLength()的频率越低可能越快。例如,可以每100(甚至1000)个元素调用一次。当然,您必须跟踪何时需要调用它:if(Length(A)<(I+1),然后SetLength(A,I+100);Deltics:我不是在说TList。这只是一个简单的列表实现,它在内部使用一个数组,尽管它至少可以处理比使用的元素数量大的数组。但是有更好的列表实现,而且Delphi容器确实需要改进。你读过关于动态数组的文档吗有一部分你不明白吗?