Decal SDL-Delphi的范型类库-通用数据结构与算法类库(一)

原创 2003年01月29日 17:09:00

1、Decal SDL 通用数据结构与算法类库
我个人认为是目前类结构建模建得很好的一个数据结构类库。

介绍
Decal的前身是 SDL,一套商业的通用数据结构与算法类库。Decal删除了其中关于垃圾回收部分的代码,而将其他部分全部开放源代码了,这对大家来说是一个好消息。Decal的全称是 Delphi Container and Algorithm Library,也就是Delphi 数据容器和算法类库。Decal是基于 Mozilla 开放源程序协议的一个数据结构类库,它的作者是Soletta。Decal的一些思想是来自Stepanov 和 Lee 的 C++ STL(Standard Template Library) 和 ObjectSpace’s JGL (Java Generic Library)。

Decal 提供许多其它Delphi类库中没有的功能:
* 基于已经成熟的STL体系,强有力的底层工艺。
* Decal 是基于通用计算机算法和数据结构的类库。
* 提供容易使用的方式存储各种数据类型。(如 Integers, Strings, Extended values)。
* Decal 使用了Delphi 4的数组常量 array of const 功能,该功能极大的减轻了程序员的负担。
* Decal 提供超过 60 种的常用算法。
* Decal 集成 SuperStream 为数据存放到流中提供了解决方案。
* 完整的数据结构类库。Decal 包括:数组 arrays, 双向链表 double-linked lists, 映射 maps, 和集合 sets。 映射结构包括二叉树和散列两种形式。

Decal 的术语解释:
Item (数据项)
在 Decal, 数据项 (items) 是如下的基本数据类型:
整数(Integer), 字符串(String), 货币(Currency), 或字符(Char)类型等。 一个对象(object)也是一种数据项。

Container(容器)
容器是用来保存数据项的。它是一种数据结构。不同类型的容器(数据结构)拥有不同的能力。据一个例子来说,某种类型的容器也许拥有快速的删除能力,但是添加较慢,而另一种容器支持快速的随机访问,但是删除较慢。当你需要容器保存数据项时,选择适当的容器类型将让你的程序效率倍增,反之亦然。每一种容器的利弊我们将在后面详述。

Iterator(数据项指针)
Iterator 就是数据项指针,它指向容器中某一特定的数据项。数据项指针可以前后移动,存取数据项都是通过Iterator(数据项指针)实现的。使用Iterator(数据项指针)访问数据,可以使你在改变容器类型后,对数据项的处理不用作任何的改变。我们经常会看到如下的代码:
Iterator := container.start;
Iterator := container.finish;
第一行代码是取出容器的第一项数据,而第二行是取出容器的 atEnd 结束数据项(最后一数据项的后一个位置,标志结束)

Comparator (比较函数)
比较函数(comparator)用来比较两个数据乡的大小。如果第一项小于第二项,那么函数应该返回一个小于0的值;如果相等则返回数值0;如果第一项大于第二项,那么函数应该返回一个大于0的值。下面是比较函数的定义:

DComparator = function (const obj1, obj2 : DObject) : Integer of object;


AtEnd
Decal 使用数据项指针(iterators)维护容器里的数据项位置。有一个特殊的数据项指针(iterator)叫做: atEnd。
atEnd 数据项指针指示已经达到容器中的最末尾,已无数据可取。从该位置取数据是非法的!有时向该位置写是合法的。某种容器会添加一个对象到atEnd标志(certain containers will add the object being written to the end of the container),但并不是所有的容器都这样做,尤其是映射类容器(mapping containers)。 AtEnd 是非常重要的,当算法无法前进到下一个数据项时它们就会返回 atEnd。

Range (范围)
范围是两个数据项指针,标示数据项的开始位置和结束位置。例如:在 container.start 和 container.finish 之间的数据项就是一个范围。

Pair(数据对)
一个数据对是两个数据项(两个 DObjects, 存储在一个 DPair 中)。映射容器(mapping containers)存储的数据就是数据对,存储的数据对由关键字key(第一个字段)和数据值 value (第二个字段) 构成。

Sequence (序列类型容器)
序列类型容器里的数据项有一定的顺序。序列类型容器将数据项按照一定的顺序,逐一取出。序列类型容器有:链表,数组等。

Vector(向量类型容器)
向量类型容器是由序列类型容器派生而来的。与序列类型容器不同的是,向量类型容器的每一个数据项都是有数字可寻址的。换句话说,你可以想取第一项就取第一项,想取第五项就取第五项。当序列需要返回指定位置的数据项,向量类型容器就是一个有效的实现。向量类型容器的一个有用的实现就是数组。

Map (映射类型容器)
映射类型容器用于存储关键字/值(key-value)数据对。你应该特别重视该类,因为 90%的容器应用都是基于的映射类型容器的应用。映射类型容器可以保存关联数据。举个例子,当你希望保存一系列的员工数据,按照员工ID查找,你就可以使用映射类型容器,将员工ID作为Key,员工数据类作为数据值:
Map.putPair([1001, jimSmithObject]);

当你想取出员工ID为1001的员工数据时候:
employee := getObject(map.locate([1001])) as TEmployee;
映射类型容器对查找关键字非常有效!
Decal 有两种基本的映射类型容器:
  排序映射类型容器(An ordered map:基于红-黑二叉树 red-black trees)
  混乱映射类型容器(An unordered map: 基于散列 hash structures).
映射类型容器有种基本变体: MultiMap 映射类型容器。
他们的不同之处在于 MultiMaps 可以在同一关键字上存储多个对象。而常规映射类型容器在不能在同一关键字上存储不同对象。

Set (集合类型容器)
集合类型容器存储数据项。与 Delphi 的集合概念类似,用来让你快速的确认是否该集合包含或不包含特定的数据项。与Delphi的集合类型不同的是,你可以使用任何的原子数据类型作为集合的元素,如:数字,字符串,对象等等。
与映射类型容器类似,集合类型容器也有种基本变体: MultiSets。MultiSet集合类型容器可以允许有多个同一对象在集合内。
集合类型容器也有两种基本类型:基于红-黑二叉树和基于散列的。

Hashing(散列)
散列(Hashing)是将某一数据项或对象转换成一个标示该数据项或对象的数字。

 

Decal SDL-Delphi的范型类库-通用数据结构与算法类库(一)

 介绍Decal的前身是 SDL,一套商业的通用数据结构与算法类库。Decal删除了其中关于垃圾回收部分的代码,而将其他部分全部开放源代码了,这对大家来说是一个好消息。Decal的全称是 Delphi...
  • justin_hua
  • justin_hua
  • 2007年08月02日 18:11
  • 596

C# 通用日志 log4net 公共类库 (可扩展)

之前如果搭建一个新项目,想要使用日志就必须复制一套log4net的web.config的配置,复制都还好,关键当你复制完,发现并不能用,而且还不知道哪里错了。。。  最终忍无可忍,这个通用日志类库就诞...
  • yo548720570
  • yo548720570
  • 2016年12月22日 15:25
  • 986

分享通用基类库-C#通用字符串处理类

/************************************************************************************* * 代码:吴蒋 * 时...
  • wujiang1984
  • wujiang1984
  • 2012年03月30日 13:40
  • 1363

java 自定义类库

eclipse支持用户导入自定义的类库,方法也是很简单,大致如下:选择项目》右键》build path》Configure Build Path》如果需要导入jar包的话,应该事先把jar包复制到项目...
  • u010890857
  • u010890857
  • 2015年06月12日 10:12
  • 257

Java常用类库(一)

Java常用类库(一)   ---------------------- 认识StringBuffer StringBuffer是使用缓冲区的,本身也是操作字符串的,但是与Stri...
  • e6894853
  • e6894853
  • 2012年08月30日 15:30
  • 6903

(干货).NET开发丰富的公共类库助你事半功倍(供下载免费使用)

(干货).NET开发丰富的公共类库助你事半功倍(供下载免费使用)       Good company on the road is the shortest cut.(行路有良伴就是捷径)。作为开发...
  • chinahuyong
  • chinahuyong
  • 2013年05月27日 15:41
  • 10401

分享通用基类库-C#通用缓存类

/************************************************************************************* * 代码:吴蒋 * 时...
  • wujiang1984
  • wujiang1984
  • 2012年03月30日 13:37
  • 3128

库,框架,类库的区别与联系

库和框架都是一种有别于软件、面向程序开发者的产品形式。正因为如此,也有很多人 误以为库就是框架,或者认为指定语言的库就是框架。 库的英语为 Library ( 简写 Lib ),框架的英语为 F...
  • lililiyunqiang
  • lililiyunqiang
  • 2014年01月21日 09:32
  • 1652

浅谈框架以及类库

框架和类库等概念的出现都是源于人们对复用的渴望。“不要重复发明轮子”,成了软件界的一句经典名言。从最初的单个函数源代码的复用,到面向对象中类的复用(通常以类库的形式体现),再到基于组件编程中二进制组件...
  • tianyeming
  • tianyeming
  • 2015年12月16日 15:20
  • 1663

几个通用组件类库项目 开放源码下载

应众多网友的请求和来信,现决定对动软.net代码生成器生成的三层架构项目中涉及的几个组件类库开发源码,提供下载。期望大家在修改发布时能保留对作者版权的尊重。同时期望有修改或更新的朋友也能上传一份,或共...
  • litp
  • litp
  • 2008年03月20日 23:27
  • 4137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Decal SDL-Delphi的范型类库-通用数据结构与算法类库(一)
举报原因:
原因补充:

(最多只允许输入30个字)