【问题标题】:What Are Collections Implemented As In VB6?VB6 中实现的集合是什么?
【发布时间】:2010-03-30 20:36:31
【问题描述】:

因此,VB6 中的集合跟踪每个对象的键,您可以通过键查找对象。

这是否意味着集合在底层实现为某种哈希表?我意识到你可以在一个集合中拥有多个具有相同键的项目,因此 SOME SORT。

有人知道 VB6 集合应该代表什么类型的数据结构吗?

【问题讨论】:

  • 您可以在 VB6 集合中拥有多个具有相同键的项目。
  • 你测试过这个吗?明天我会测试这个...我原以为添加相同的密钥不是问题。
  • 使用 NO 键添加多个项目是可以的,但键是不区分大小写唯一的(与 Option Compare 声明无关)。
  • 确实你不能在集合中复制一个键,但是你可以在没有键的情况下添加同一个对象的多个副本......这很奇怪,因为如果它在幕后对对象进行散列,不会不是每次都得到相同的哈希值吗?我希望我知道语言创建者的意图。

标签: collections vb6


【解决方案1】:

据我所知,VBA 集合被实现为一个链表(由整数索引和 For Each...Next 使用)和一个哈希表(由键使用)。正如 Raven 所说,您不能拥有多个具有相同密钥的项目。

已编辑:

@MarkJ:我应该为此引用: 硬核 Visual Basic 第 2 版。 Bruce McKinney,微软出版社 1997 年出版 ISBN 1-57231-422-2

行情:

第 191 页 - 集合类

“简单地说,Collection 类是 CList 类的增强 C++ 版本 [...]。事实上,如果您将 CList 增强为双向链表并赋予它更多特性(并且可能使用哈希表来查找字符串键),您将拥有一个与 Visual Basic 提供的集合类非常相似的集合类。”

第 197 页 - 性能

“事实上,Visual Basic 开发人员告诉我,集合是双向链表(具有支持索引的附加功能)。”

现在,麦金尼更像是一名记者,而不是一名程序员,而不是一名开发人员。但是,他确实为 Microsoft 工作,并且在 VB 和 VBA 团队中有联系。他的解释对我有用。

顺便说一句,使用双向链表的原因是为了在集合的开头和结尾都插入项目更有效。

【讨论】:

  • 那么这是否意味着同时存在一个链表和一个哈希表并排存在,持有对相同项目对象的引用?并且根据您的迭代方式,是否根据需要使用不同的数据结构?
  • Mark 描述了访问集合的代码接口。我们只能推断,在底层必须是支持该功能的东西。我们可以推测它可能使用链表和哈希表,但我们不知道。
  • @MarkJ:我希望有人能给我指出一个资源,以消除对实施的猜测。
  • @Tom T:我知道,我的意思是这个答案没有做到。
  • 感谢您的更新!我认为这几乎可以回答我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2020-10-01
  • 2011-09-24
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多