JCL容器类的使用

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;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值