CnPack Forum


 
Subject: TCnStrToPtrHashMap 问题
wuyou
新警察
Rank: 1



UID 10433
Digest Posts 0
Credits 11
Posts 4
点点分 11
Reading Access 10
Registered 2007-4-12
Status Offline
Post at 2010-3-26 22:44  Profile | Blog | P.M. 
TCnStrToPtrHashMap 问题

var
  count: integer;
  map : TCnStrToPtrHashMap;
  p : Pointer
begin
count := 3;
//如果分配得刚刚好,下面就出错
map := TCnStrToPtrHashMap.Create(count);
//而如果:多分配几个空间,下面就没有问题
map := TCnStrToPtrHashMap.Create(count+1);

map.Add('01', @map);
map.Add('02', @map);
map.Add('03', @map);

//下面返回是 False
Map.Find('01', p);


end;
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2010-3-29 11:39  Profile | Site | Blog | P.M. 
多谢报告!

经检查,这确实是一个Bug,已经修正:
http://code.google.com/p/cnpack/source/detail?r=469
建议您通过SVN更新到最新版本使用。

另外,HashMap 是一种空间换时间的算法,通常为 Hash 表分配的项目数应数倍于预期需要保存的项目数,否则会因为 Hash 值碰撞重定位带来性能的严重下降。
虽然 HashMap 在增加子项时会自动增长存储空间,但增长的效率较低,所以建议使用 HashMap 时如果能估算出列表项目数,可以在创建 HashMap 时取2-5倍或更多的项目数来初始化。

PS:在贴出的代码中,@map取的是map变量的地址(局部变量在堆栈上的地址),而不是map对象的地址,如果需求是保存对象的话,应该直接用 map 而不是 @map。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
wuyou
新警察
Rank: 1



UID 10433
Digest Posts 0
Credits 11
Posts 4
点点分 11
Reading Access 10
Registered 2007-4-12
Status Offline
Post at 2010-4-3 11:15  Profile | Blog | P.M. 
谢谢!回复得不错,受教了

PS:在贴出的代码中,@map 只是一个例子,没有什么特别的意思

不过学是学到一招
Top
 




All times are GMT++8, the time now is 2024-3-29 08:34

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.006128 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP