我尝试继承Tdictionary,并以某种方式丢失默认比较器.这就是我的本质:
type
TinpVar = class
end;
TinputVars = class(Tdictionary<string,TinpVar>)
end;
TLVRvars = class(TinputVars)
constructor create;
end;
constructor TLVRvars.create;
begin
inherited;
end;
var LVRvars : TLVRvars;
begin
LVRvars:=TLVRvars.create;
Run Code Online (Sandbox Code Playgroud)
通过这种结构,我在向LVRvars添加键/值对时获得AV.最终我发现可以通过将继承类的构造函数更改为可以防止这种情况
constructor TLVRvars.create;
begin
inherited create;
end;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么要这样做.虽然我的问题已经解决,但我仍然想知道.
在 QuickSort 中,很多时间都花在了 swap 上temp:=var[i]; var[i]:=var[j]; var[j]:=temp。当 vars 是整数时,我为大型随机数组计时 140 毫秒。当变量为字符串时,时间为 750 毫秒。在我看来,大部分差异是由于需要更新所有三个分配中的引用计数造成的。但这有必要吗?毕竟,在这三个赋值之前和之后,var[i] 和 var[j] 的引用计数是相同的。下面的代码会破坏东西吗?(不是说它解决了速度问题,而是出于兴趣):
// P : Pstring;
move(values[i],P,sizeOf(Pstring));
move(values[j],values[i],sizeOf(Pstring));
move(P,values[i],sizeOf(Pstring));
Run Code Online (Sandbox Code Playgroud)
没有临时变量。只有指向字符串的两个指针被交换。如果这没问题,是否有 Delphi 函数来交换 2 个指针?
我使用数组并在类的上下文中测试了功能,例如:
Ttest = class
values : array of integer;
procedure doStuff;
end;
Run Code Online (Sandbox Code Playgroud)
与doStuff所有方法一样,这些方法都对值数组进行操作,而无需将数组作为参数传递。这适合我,而且速度很快。现在我想使用这个类来处理外部数组,比如Ttest.create(myValues)在构造函数中我可以复制myValues到内部,values但这会很浪费,而且,最后必须反转复制以将更新的值传回. 我的问题是如何扩展这个类,以便它可以有效地处理外部数组。在这样的伪代码中:
constructor create(var myValues : array of integer);
begin
address of values := address of myValues;
doSTuff;
end;
Run Code Online (Sandbox Code Playgroud)