我正在尝试优化一段包含对象(指针)之间关系的代码。
情况如下:
从一系列对象中生成一系列图纸:
TElement(A)--->生成零,一个或多个TDrawing(B)
(类不相关,所以我称之为A和B)
当前的实现是使用字典
TDictionary< B,A>
因此B类中的每个对象都来自一个独特的A
但是为了识别属于类A的给定对象的B类的所有对象,这是非常低效的,因为字典需要循环以找到具有特定值的所有键。
直接的解决方案是将数据结构更改为以下内容:
TDictonary< TELEments,TList< TDrawing> >
这不是完全有效的,因为在填写字典和列表时需要进行大量的小内存分配。
我想知道是否有人能给我一个好的实施提示,我将不胜感激!
(对不起我的英文)
答案 0 :(得分:-1)
一个非常难看的代码,但我已经提出了这个解决方案:
PLinks:TDictionary<TElement, TObject>;
其中值是单个对象或列表。添加值时,如果先前未设置该键,则将其设置为该对象。只有在尝试为键添加第二个值时,该值才会转换为列表。
procedure AddLink(const source:TElement; object:TDrawing);
var
v:TObject;
list:TList<TDrawing>;
begin
if not PLinks.ContainsKey(source) then
PLinks.Add(source, object)
else begin
v:=PLinks[source];
if v is TList<TDrawing> then
(valor as TList<TDrawing>).add(n)
else begin // v is TDrawing
list:=TList<TDrawing>.Create;
list.Add(v as TDrawing); // adds previous unique item
list.Add(object);
PLinks[source]:=list;
end;
end;
end;
显然,当循环遍历值时,必须检查该值是单个对象还是列表。
它不是很优雅,主要是因为编译时类型检查丢失了,但就速度和内存节省来说还不错。