[转贴]Delphi 的数据结构泛型类库指南,Delphi中的STL

终于给我找到了,DeCAL,Delphi中的STL,以后终于有Map用了。
我选择,我喜欢!

以下是转载:

声 明
一、 关于在Internet 网上转发本文件的声明
任何个人或者机构可以在Internet 上自由的转发和引用本文。但转发过程中必须保证本文的完整性, 不得进行任何的修改。
作者允许任何个人或者机构在本文的转发过程中附带其它的文件来描述、补充或者评价本文。但不得在本文的原文中修改。

二、 关于在传统媒体上刊载、使用、引用本文件的声明
禁止在未经本人书面(含电子邮件) 许可的情况下在传统媒体上刊载、使用、引用本文件的部分或全部内容。
如果确需刊载、使用、引用本文件, 请用Mail 与本人联系。本
人联系Mail: riceball@cq118.com 或 riceballl@hotmail.com。

在写了N个软件项目后,厌倦了对每个项目都需要调整自己的数据结构,虽然只需要稍微调整,但是还是觉得不爽,而且如果原有数据量或者操作规则发生变化,就需要更换数据结构才能适应新的需要,烦啊。要是能抽象出所有数据结构的共同特征,写一个通用的数据结构类库,岂不快哉。

先在网上找找看:

Containers
  是Ralf Junker 所写的通用数据结构与算法类库:  
Homepage:  http://www.zeitungsjunge.de/delphi/containers/index.htm
该类库是 shareware, 要USD$60,00。

EZDSL(Easy Data Structures Library for Delphi)
  是Julian M. Bucknall 所写的通用数据结构与算法类库,据说比C++的STL还快:
Homepage:  http://www.boyet.com/
下载地址:http://www.boyet.com/support/ezdsl303.zip
作者写了一本书:The Tomes of Delphi: Algorithms and Data Structures
http://www.boyet.com/DADS/Reviews.htm
该类库是免费的,不过作者希望得到捐助。

Delphi Fundamentals
  是David Butler 所写的通用数据结构与算法类库
  http://prdownloads.sourceforge.net/fundementals/fndUtl31.zip
该类库是免费的

TurboPower's Systools 中也有数据结构与算法类库
  Container Classes
当然它是收费的,现在已经开放源码了。

Delphi Collections 数据结构与算法类库
http://www.warmachine.u-net.com/delphi_collections
Copyright 2003 by Matthew Greet, published under LGPL v2.1.
使用 interface 实现的。

Delphi(ObjectPascal) DeCAL数据结构与算法泛型类库
http://sourceforge.net/projects/decal/
DECAL 是基于 Mozilla 开放源程序协议的一个数据结构类库,它的作者是Soletta。


在比较以上的数据结构与算法类库之后,我选中的是DeCAL数据结构与算法泛型类库,不过遗憾的是以上所有的数据结构算法类库中,没有我期望的数据存储自由缩放(自主决定数据存放于内存或文件中)功能,看样子这个功能只有自己加了。



对 DeCAL 的分析
1、Decal SDL 通用数据结构与算法类库 -范型编程类库
我个人认为是目前我所发现的类结构建模建得很好的一个数据结构类库,性能也是相当突出。缺点:他的思想是来自Stepanov 和 Lee 的 C++ STL(Standard Template Library) 和 ObjectSpace’s JGL (Java Generic Library),因此在库中的函数、变量等援用了STL的术语名称,这些术语不符合 Delphi 编程语言规范的习惯,需要重新去理解,麻烦。我决定首先把该类库尽量改成符合 Delphi 编程语言规范习惯的用语。首先从学习STL的术语开始吧。

DECAL 简介
  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有至少10种不同的数据结构。

基本概念
Containers(容器), Algorithms(算法), and Persistence(保存).

Containers:
数据结构类的统称。在这里我们讨论Decal的各种数据结构。列举各种数据结构的利弊。并展示 Iterator 的概念。

Algorithms
列出在Decal中的主要的算法类型,并告诉你如何应用到Container中去!

Persistence
谈论如何从流中保存和读取数据。

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

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

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

Comparator (比较函数) 这应该是比较事件,当需要比较数据项的大小的时候被调用的过程。这个需要改成 Delphi 的习惯用语。
比较函数(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;

Set (集合类型容器)
集合类型容器存储数据项。与 Delphi 的集合概念类似,用来让你快速的确认是否该集合包含或不包含特定的数据项。与Delphi的集合类型不同的是,你可以使用任何的原子数据类型作为集合的元素,如:数字,字符串,对象等等。

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

Algorithm(算法)
算法是用于解决问题的一系列的计算步骤。



性能评测略。。。

原贴:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=4640

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值