?? 在delphi中實現(xiàn)類型安全的容器.txt
字號:
在Delphi中實現(xiàn)類型安全的容器
by HouSisong@263.net,2004.09.12 (2006.10.20更新)
最近都在使用Delphi,但Delphi中的容器和算法實在太缺乏了,又存在很多不一致,使用也很不方便。
在構(gòu)造一些容器和算法的時候,總是懷念C++的泛型和STL;所以就嘗試在Delphi中編寫泛型代碼;
其它現(xiàn)有的Deplhi容器和算法庫實現(xiàn)中,主要的實現(xiàn)途徑有利用Delphi中的array of const(相當(dāng)于弱類型,而且對結(jié)構(gòu)的支持差,如Decal);或者建立一套類體系作為容器中的元素(主要使用虛函數(shù)機(jī)制,如:左輕侯有篇文章也談到過; 一般簡單類型需要做打包拆包);還有的實現(xiàn)是針對TObject、IInterface、String等做多套代碼實現(xiàn)(如:DCL庫); 但他們相對于C++的STL來說缺陷也很明顯,類型不安全,速度慢,代碼重復(fù);
DGL庫沒有這些問題,庫能夠支持所有基本類型、指針(包括類的指針)、Interface、結(jié)構(gòu)(record)、Object結(jié)構(gòu)(Delphi中已經(jīng)不推薦使用)、類成員函數(shù)指針、類(class)的值語義(一般Delphi中不習(xí)慣使用類的值語義,所以不建議使用)等其它用戶自定義類型,并且類型安全(速度當(dāng)然沒有問題啦), 沒有重復(fù)代碼!
庫現(xiàn)在包括以下組件:
<object>
_IIterator 容器迭代器
_IMapIterator Map迭代器
(PointerBox函數(shù)可以將原生指針包裝成一個與庫兼容的迭代器)
<接口interface>
_ICollection 容器接口
_ISerialContainer 序列容器的接口
_IVector 向量接口(容器的一種)
_IList 鏈表接口(容器的一種)
_IDeque 隊列接口(容器的一種)
_IStack 堆棧接口(一種容器配接器)
_IQueue 雙端隊列接口(一種容器配接器)
_IPriorityQueue 優(yōu)先級隊列
_ISet Set接口
_IMultiSet MultiSet接口
_IMap Map接口
_IMultiMap MultiMap接口
<類class>
_TAlgorithms 算法類(包括:拷貝、替換、刪除、排序、搜索等算法)
_TVector 向量實現(xiàn)類
_TList 鏈表List的一個實現(xiàn)
_TDeque 隊列Deque的一個實現(xiàn)
_TStack 堆棧Stack
_TQueue 雙端隊列Queue
(_TRB_Tree 紅黑樹(庫內(nèi)部使用))
_TSet 用紅黑樹實現(xiàn)的Set
_TMultiSet 用紅黑樹實現(xiàn)的MultiSet
_TMap 用紅黑樹實現(xiàn)的Map
_TMultiMap 用紅黑樹實現(xiàn)的MultiMap
(_THashTableBase Hash表(庫內(nèi)部使用))
_THashSet 用Hash表實現(xiàn)的Set
_THashMultiSet 用Hash表實現(xiàn)的MultiSet
_THashMap 用Hash表實現(xiàn)的Map
_THashMultiMap 用Hash表實現(xiàn)的MultiMap
實現(xiàn)原型舉例:
“模版”類的聲明文件:UnitClassT.inc_h
[code]
//<template:_T,_T_IsEqual>
type
TTest = class(TObject)
private
a : _T;
public
function GetA():_T;
fucntion IsEqual(ATest:TTest):bool;
end;
[/code]
“模版”類的實現(xiàn)文件:UnitClassT.inc_pas
[code]
function TTest.GetA(): _T;
begin
result:=a;
end;
fucntion IsEqual(ATest:TTest):bool;
begin
result:=_T_IsEqual(a,ATest.a);
end;
[/code]
//////////////////////////////////////
使用的時候?qū)Α澳0妗鳖愖鰌ointer的特化
[code]
unit UnitTestPointer;
interface
type _T = Pointer;
function _T_IsEqual(cosnt a,b:_T);
{$I UnitClassT.inc_h}
type TTestPointer = TTest; // TTestPointer定義給外部使用
implementation
{$I UnitClassT.inc_pas}
function _T_IsEqual(cosnt a,b:_T);
begin
result:=(a=b);
end;
end.
[/code]
使用的時候?qū)Α澳0妗鳖愖鰀ouble的特化
[code]
unit UnitTestDouble;
interface
type _T = double;
{$I UnitClassT.inc_h}
type TTestFloat = TTest; // TTestFloat定義給外部使用
function _T_IsEqual(cosnt a,b:_T);
implementation
function _T_IsEqual(cosnt a,b:_T);
begin
result:=(a=b);
end;
{$I UnitClassT.inc_pas}
end.
[/code]
(將類分成兩個部分的原因是這樣可以$Include更多的文件,形成組合;感覺象C++ )
這里只對一個_T類型做了參數(shù)化,當(dāng)然還可以對多個類型做特化;甚至參數(shù)化一些常量和其他函數(shù)(比如Hash值函數(shù)),利用$define\$ifdef進(jìn)行條件編譯(主要用來優(yōu)化或特殊處理);用這種方法再加上接口(Interface,不是必須);在Delphi中就可以實現(xiàn)通用\高效\易用的容器和算法庫了;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -