从Delphi中的TList开始删除大块项目的有效方法是什么?

ros*_*mcm 8 delphi delphi-2006 tlist

从TList删除(0)是昂贵的,因为所有后续项目都需要向下移动.如果我需要从更大的列表的开头删除大量项目,那么最快的方法是什么?

Dav*_*nan 8

从一开始就删除大量元素TList是很昂贵的.虽然类名称可以欺骗,但TList实际上是一个数组.在TList没有任何设施,以删除某个范围内,每个项目必须单独删除,然后将列表的其余部分下移.对于大范围而言,这会引发大量的重新分配和完整列表移动.

如果你有一个更现代的Delphi,你可以使用泛型列表类,TList<T>并利用该DeleteRange方法.该文档包括以下重要说明:

这是O(ACount)操作.

在Delphi 2006中,您可以编写具有相同性能特征的内容,如下所示:

procedure DeleteRange(List: TList; AIndex, ACount: Integer);
var
  i: Integer;
  NewCount: Integer;
begin
  NewCount := List.Count-ACount;
  Assert(AIndex>=0);
  Assert(ACount>=0);
  Assert(NewCount>=0);
  for i := AIndex to NewCount-1 do
    List[i] := List[i+ACount]
  List.Count := NewCount;
end;
Run Code Online (Sandbox Code Playgroud)