代码之家  ›  专栏  ›  技术社区  ›  jpfollenius Rob Kennedy

指向泛型类型的指针

  •  5
  • jpfollenius Rob Kennedy  · 技术社区  · 15 年前

    在将给定的基于指针的高效散列图实现转换为通用散列图实现的过程中,我偶然遇到了以下问题:

    我有一个表示哈希节点的类(哈希映射实现使用二叉树)

    THashNode <KEY_TYPE, VALUE_TYPE> = class
    public
      Key      : KEY_TYPE;
      Value    : VALUE_TYPE;
      Left     : THashNode <KEY_TYPE, VALUE_TYPE>;
      Right    : THashNode <KEY_TYPE, VALUE_TYPE>;
    end;
    

    除此之外,还有一个函数应该返回指向哈希节点的指针。我想写

    PHashNode = ^THashNode <KEY_TYPE, VALUE_TYPE>
    

    但无法编译(应为';'但找到'<')。

    如何获得指向泛型类型的指针?

    如果你读到这个:是的,这是基于你的散列图实现。您还没有自己编写这样一个实现的通用版本,是吗?这会节省我一些时间:)

    4 回复  |  直到 15 年前
        1
  •  11
  •   Barry Kelly    15 年前

    不好意思,粉碎者。不支持指向打开泛型类型的指针,因为不支持泛型指针类型,尽管在某些情况下(编译器错误)可以创建它们(尤其是指向泛型类型内嵌套类型的指针);如果我们破坏了某人的代码,则在更新中无法删除此“功能”。对通用指针类型的限制应该在将来消除,但我不能保证何时消除。

    如果所讨论的类型是 JclStrHashMap 我写的(或古代的) HashList 最简单的复制方法是将节点类型更改为类并传递任何双指针 Pointer 适当的铸造。但是,如果我今天再次编写这个单元,我就不会将bucket实现为二进制树。我有机会在generics.collections单元中编写字典,尽管其他所有Delphi编译器的工作时间都太紧了,在交付之前还没有进行可靠的QA,而且通用特性支持本身一直在不断变化,直到相当晚。

    我更愿意将哈希图存储桶实现为每存储桶动态数组或连续数组中的单元格链接列表中的一个,以使用代表性数据的测试结果最好的为准。其逻辑是,树/列表中的以下链接的缓存未命中成本应在具有良好哈希函数的树和列表之间的bucket搜索中占主导地位。当前的字典被实现为直接线性探测,主要是因为它相对容易实现并使用可用的一组基元泛型操作。

    也就是说,如果二叉树是平衡的,那么二叉树桶应该是一个有效的对冲,以防散列函数不好。( => 更高的修改成本),它们将是O(1)平均值和O(log n)最坏情况下的性能。

        2
  •  4
  •   Mason Wheeler    15 年前

    要真正回答您的问题,您不能创建指向泛型类型的指针,因为“泛型类型”不存在。您必须创建一个指向特定类型的指针,并填写类型参数。

    不幸的是,编译器不喜欢在^后查找尖括号。但它将接受以下条件:

       TGeneric<T> = record
          value: T;
       end;
    
       TSpecific = TGeneric<string>;
    
       PGeneric = ^TSpecific;
    

    但是“ PGeneric = ^TGeneric<string>; “给出编译器错误。听上去像个小故障。如果我是你的话,我会在质量控制部报告。

    不管怎样,你为什么要做一个指向对象的指针?Delphi对象是引用类型,因此它们已经是指针了。您可以将对象引用强制转换为指针,这样就很好了。

        3
  •  4
  •   Rob Kennedy    15 年前

    如果 Delphi完全支持通用指针类型,它必须如下所示:

    type
      PHashNode<K, V> = ^THashNode<K, V>;
    

    也就是说,在左侧声明类型名称的通用参数,然后在右侧构造类型时使用这些参数。

    然而,德尔福 支持这一点。见 QC 66584 .

    另一方面,我也会质疑 指向类类型的指针。是否通用。他们只需要 非常 很少。

        4
  •  2
  •   Mason Wheeler    15 年前

    在generic s.collections单元中有一个名为tdictionary的通用哈希映射。不幸的是,目前它已经严重损坏,但很明显它将在更新3中修复,这是到期的 within a matter of days, according to Nick Hodges .