一、TBucketList类的理解

1.1 1.1 TCustomBucketList类

    由于TBucketList类是从TCustomBucketList类派生而来的,所以我们要研究一下TCustomBucketList类的定义。他们的继承关系是:

                TBucketList——>TCustomBucketList——>TObject

    首先,先让我们来看看TCustomBucketList究竟实现了怎样的一种数据结构,它通过对动态数组的合理运用实现了在纵横方向大小都是动态的桶状数据结构;在纵向它有两个字段,分别是Count: Integer和Items: TBucketItemArray。其中,Count字段表示该子桶的横向桶的大小;而Items是横向桶的动态数组。在横向动态数组的结构记录中包含两个字段,分别是Item: Pointer和Data: Pointer两个指针。由该枚举类型TBucketListSizes = (bl2, bl4, bl8, bl16, bl32, bl64, bl128, bl256)可以知道,TBucketList的纵向大小有2、4、8、16、32、64、128、256的八种大小的桶状结构;如图是该数据结构:

       

    当使用Add方法向Bucket数据结构中添加数据Item和Data时,在TBucketList类中用BucketFor方法实现了利用所添加的Item指针地址的第二个字节的值来取得将要把数据域添加到Buckets数组的下标,算法如:

            Result := LongRec(AItem).Bytes[1] and FBucketMask; //其中FBucketMask: Byte= ($01, $03, $07, $0F, $1F, $3F, $7F, $FF);

    既是说,在Buckets中实际上是一种Hash表的算法。

1.2 2.1 TBucketList类的重要方法

    在TCustomBucketList类中提供ForEach方法,定义如:function ForEach(AProc: TBucketProc; AInfo: Pointer = nil): Boolean;该可以遍历Buckets里的每一个数据域,并提供了一个函数接口。

        Type TBucketProc = procedure(AInfo, AItem, AData: Pointer; out AContinue: Boolean);

既通过回调函数,程序员可以自定义对每一个数据域的处理过程,方便地对Buckets中的每一个数据域进行所需要的处理。


posted on 2006-11-16 19:22  望天  阅读(868)  评论(0编辑  收藏  举报