Delphi中的容器类

TClassList详解

从Delphi
5开首VCL中加进了一个新的Contnrs单元,单元中定义了8个新的类,全部是基于职业的TList
类。 

单元:Contnrs

  TList 类

  TClassList世袭自TList。不一致的是,TList的例行操作的是指针(Pointer),而TClassList操作的是TClass,也便是TObject的类援引。
  TClassList的例行操作与TList拾贰分相像,包罗:Add()、Extract()、Remove()、IndexOf()、First()、Last()、Insert()、以至最注重的Items[]。
  能够看出,TClassList类的成员操作方法比起TList类要少的多,但对此日常的类集的管住好多也够用了。
  TClassList类全体办法的拘系力量总体来源其基类TList,所以大家能够看来在其方法中常常现身inherited
xxx,那也得以从三个侧边说明类引用(TClass)参数,其实本质上是一个指南针。

  TList
类实际上正是一个方可积存指针的容器类,提供了一花样好些个的主意和属性来拉长,删除,重排,定位,存取和排序容器中的类,它是依附数组的编写制定来落成的容器,相比较像样于C++中的Vector和Java中的ArrayList,TList
日常用来保存豆蔻梢头组对象列表,基于数组实现的建制使得用下标存取容器中的对象非常快,可是随着容器中的对象的充实,插入和删除对象速度会直线下跌,因而不适合频仍增加和删除对象的运用途景。下边是TList类的性格和办法求证:

单元:Contnrs
TClassList继承自TList。差异的是,TList的健康操作的是指针(Pointer),而TClassList操作的是TClass,也等于TObject的类援引。…

属性 描述
Count: Integer; 返回列表中的项目数
Items[Index: Integer]: Pointer; default 通过以0为底的索引下标直接存取列表中的项目
方法 类型 描述
Add(Item: Pointer): Integer; 函数 用来向列表中添加指针
Clear; 过程 清空列表中的项目
Delete(Index: Integer); 过程 删除列表中对应索引的项目
IndexOf(Item: Pointer): Integer; 函数 返回指针在列表中的索引
Insert(Index: Integer; Item: Pointer); 过程 将一个项目插入到列表中的指定位置
Remove(Item: Pointer): Integer; 函数 从列表中删除指针
名称 类型 描述
Capacity: Integer; property 可以用来获取或设定列表可以容纳的指针数目
Extract(Item: Pointer): Pointer; function Extract 类似于Remove 可以将指针从列表中删除,不同的是返回被删除的指针。 
Exchange(Index1, Index2: Integer); procedure 交换列表中两个指针
First: Pointer; function 返回链表中的第一个指针
Last: Pointer; function 返回链表中最后一个指针
Move(CurIndex NewIndex: Integer); procedure 将指针从当前位置移动到新的位置
Pack; procedure 从列表中删除所有nil指针
Sort(Compare: TListSortCompare); procedure 用来对链表中的项目进行排序,可以设定Compare参数为用户定制的排序函数

  TObjectList 类

  TObjectList 类直接从TList
类世襲,能够看成指标的容器。TObjectList类定义如下: 

TObjectList = class(TList) ...public  constructor Create; overload;  constructor Create(AOwnsObjects: Boolean); overload;  function Add(AObject: TObject): Integer;  function Remove(AObject: TObject): Integer;  function IndexOf(AObject: TObject): Integer;  function FindInstanceOf(AClass: TClass;  AExact: Boolean = True; AStartAt: Integer = 0):  Integer;  procedure Insert(Index: Integer; AObject: TObject);  property OwnsObjects: Boolean;  property Items[Index: Integer]: TObject; default;end;

  分裂于TList类,TObjectList类的Add, Remove, IndexOf,
Insert等格局都亟需传递TObject对象作为参数,由于有了编写翻译期的强类型检查,使得TObjectList比TList更切合保存对象。此外TObjectList对象有OwnsObjects属性。当设定为True
(暗中同意值),同TList类差别,TObjectList对象将销毁任何从列表中删去的对象。无论是调用Delete,
Remove, Clear
方法,依然释放TObjectList对象,都将销毁列表中的对象。有了TObjectList类,大家就再也不用利用循环来释放了目的。那就防止了自由链表对象时,由于忘记释放链表中的对象而以致的内部存款和储蓄器泄漏。别的要注意的是OwnsObjects属性不会影响到Extract方法,TObjectList的Extract方法行为看似于TList,只是从列表中移除对象援引,而不会销毁对象。

  TObjectList 对象还提供了三个FindInstanceOf
函数,能够重回唯有钦命对象类型的靶子实例在列表中的索引。纵然AExact
参数为True,唯有钦命对象类型的对象实例会被定位,倘诺AExact
对象为False,AClass 的子类实例也将被固定。AStartAt
参数可以用来找到列表中的七个实例,只要每一趟调用FindInstanceOf
函数时,将早先索引加1,就能够稳固到下叁个指标,直到FindInstanceOf
重回-1。下边是代码暗指:

var idx: Integer;begin idx := -1;  repeat  idx := ObjList.FindInstanceOf(TMyObject, True, idx+1);   if idx >= 0 then   ...  until(idx < 0);end;

  TComponentList 类

  Contnrs单元中还定义了TComponentList 类,类定义如下:

TComponentList = class(TObjectList) ...public  function Add(AComponent: TComponent): Integer;  function Remove(AComponent: TComponent): Integer;  function IndexOf(AComponent: TComponent): Integer;  procedure Insert(Index: Integer; AComponent: TComponent);  property Items[Index: Integer]: TComponent; default;end;

  注意TComponentList 是从TObjectList类世襲出来的,它的Add, Remove,
IndexOf, Insert和 Items 方法调用都使用TComponent
类型的参数而不再是TObject类型,由此切合充当TComponent对象的器皿。TComponentList
类还会有壹个特种的特色,便是只要链表中的四个组件被放走的话,它将被电动的从TComponentList
链表中除去。那是选择TComponent的FreeNotification方法能够在组件被销毁时通报链表,那样链表就足以将对象引用从链表中剔除的。
 

  TClassList 类

  Contnrs单元中还定义了TClassList类,类定义如下:

TClassList = class(TList)protected  function GetItems(Index: Integer): TClass;  procedure SetItems(Index: Integer; AClass: TClass);public  function Add(aClass: TClass): Integer;  function Remove(aClass: TClass): Integer;  function IndexOf(aClass: TClass): Integer;  procedure Insert(Index: Integer; aClass: TClass);  property Items[Index: Integer]: TClass   read GetItems write SetItems; default;end;

  分化于前边多个类,那么些类世袭于TList的类只是将Add, Remove, IndexOf,
Insert和Items 调用的参数从指针换来了TClass元类类型。

  TOrderedList, TStack和TQueue 类

发表评论

电子邮件地址不会被公开。 必填项已用*标注