我主要对稳定排序大型字符串数组感兴趣。使用真实世界的数据,我成功地以 10-100 倍击败了 Tarray.sort(即使后者不稳定)。作为练习,我尝试对简单类型重复此操作。工作正常。然后将它捆绑到一个泛型类中,就像在 Tarray 中一样。考虑我的出发点:
procedure sortArray(var values : array of byte); overload;
var temp : array of byte;
function getSequence(from: integer) : integer;
procedure doThis(...);
procedure doThat(...);
begin
setLength(temp,high(values)+1);
// actual code calling one of the procedures
end;
procedure sortArray(var values : array of double); overload;
var temp : array of double;
... etc ...
所有本地子例程都可以访问values和temp。在我看来,尝试泛型如何工作是一个理想的情况。在泛型类中不能有局部子例程,所以这些都变成了方法。然后我有:
type
TsimpleArray<T> = class
private
class function getSequence(var values,temp : array of T; from: integer) : integer;
class procedure doThis(var values,temp : array of T; ...);
...
public
class procedure sort(var values : array of T);
end;
类函数无法访问全局临时存储,因此必须将其作为参数传递给所有这些方法以及源数组。所有的comaprisons等都if v>values[k]被更改为if Tcomparer<T>.default.compare(v,values[k])>0。嗯,它有效。但现在它比我的简单程序方法慢了大约 10 倍。(仍然比 Tarray.sort 快很多。)我想这是我们为更好的可维护通用代码付出的代价。或者有什么我可以做得更好的吗?