Board logo

Subject: TCnStrToPtrHashMap 问题 [Print This Page]

Author: wuyou    Time: 2010-3-26 22:44     Subject: 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;
Author: zjy    Time: 2010-3-29 11:39     Subject: 多谢报告!

经检查,这确实是一个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。
Author: wuyou    Time: 2010-4-3 11:15

谢谢!回复得不错,受教了

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

不过学是学到一招




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0