TBucketList类

 一、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的八种大小的桶状结构;如图是该数据结构:

        buckets.JPG

    当使用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中的每一个数据域进行所需要的处理。


转载于:https://www.cnblogs.com/witluo/archive/2006/11/16/TBucketList.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值