Delphi的Jcl库是一个不错的代码库,有和C++ Stl类似的容器库,如Vector,List,HashMap, HastSet, Tree, Array等,支持线程安全与非安全,需要修改宏定义:{$IFDEF THREADSAFE} 编译不同的版本。jcl在自己的许多控件实现中使用,效率高且成熟安全,大家可以安心的用在项目中,不用重复造轮子了(:
下面的代码列举部分容器的使用方法……
1、对象链表的使用,在Jcl中可以支持高版的泛型,也可以支持低版本实现不同类型容器
uses
JclLinkedLists, JclContainerIntf;
//链表
TTestUnit = class
public
id: integer;
end;
procedure test_list;
var
obj: TTestUnit;
itr: IJclIterator; //迭代器
list: IJclList; //链表容器,接口类型,不用手动释放
i: integer;
begin
//参数1:如果不为nil,表示拷贝构造
//参数2:为假表示容器中的对象自己释放
list:= TJclLinkedList.Create(nil, False);
for i:= 0 to 100 do
begin
obj:= TTestUnit.Create;
obj.id:= i;
list.add(obj); //添加对象
end;
//迭代并删除(条件),和C++不一样,该删除不会破坏迭代器
itr:= list.First;
while itr.HasNext do
begin
obj:= TTestUnit(itr.Next);
if (obj.id mod 2) = 0 then
begin
list.Remove(obj);
obj.free;
end;
end;
//迭代删除所有
itr:= list.First;
while itr.HasNext do
begin
obj:= TTestUnit(itr.Next);
obj.free;
end;
//这里还有另一种高效的删除方式
while list.size > 0 do
begin
obj:= list.ExtractIndex(0);
if obj <> nil then
obj.free;
end;
//list不用手动释放,智能指针
end;
2、HashMap使用,关键字,效率高,数据唯一性
uses
JclHashMaps, JclContainerIntf;
//Map
TTestUnit = class
public
id: integer;
end;
procedure test_map;
var
obj: TTestUnit;
map: IJclStrMap;
itr: IJclAnsiStrIterator;
i: integer;
begin
//参数1:表示map桶大小,桶太小key计算出来的hash值容易重复,重复的key为存为链表,效率低
//参数2:是否自动释放容器中的对象
map:= TJclStrHashMap.Create(255, False);
for i := 0 to 10 do
begin
obj:= TTestUnit.Create;
obj.id:= i;
map.Items[IntToStr(obj.id)]:= obj;
end;
//这里遍历key,和value
itr:= map.KeySet.First;
while itr.HasNext do
begin
obj:= TTestUnit(map.Items[itr.Next]);
obj.Free;
end;
end;