VB6中的集合是如何实现的?

10

在VB6中,集合为每个对象跟踪一个键,并且可以通过其键查找该对象。

这是否意味着集合在内部实现时是一种哈希表?我知道可以在集合中具有相同键的多个项,因此是某种哈希表。

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


5
在 VB6 Collection 中,不能有多个具有相同键的项。 - raven
你测试过这个吗?我明天会测试这个...我曾经认为添加相同的键不是问题。 - Tom Tresansky
1
可以使用无键添加多个项,但是键不区分大小写且唯一(与Option Compare声明无关)。 - Mark Hurd
确实,在集合中无法复制键,但是您可以添加多个没有键的相同对象副本...这很奇怪,因为如果在幕后对对象进行哈希处理,那么每次不是都会得到相同的哈希值吗?我希望我知道语言创建者的意图。 - Tom Tresansky
1个回答

9
据我所知,VBA Collection实现为一个链表(由整数索引和For Each...Next使用)和一个哈希表(由键使用)。正如Raven所说,您不能具有相同键的多个项。
编辑:
@MarkJ:我应该给出我的引用:
《Hardcore Visual Basic 2nd Ed.》,作者Bruce McKinney,由Microsoft Press于1997年出版,ISBN 1-57231-422-2
引用:
第191页 - 集合类
“简单地说,集合类是一个升级版的C++版本的CList类[...]。实际上,如果将CList增强为双向链表并赋予其更多功能(并且可能使用哈希表来查找字符串键),则会拥有与提供的Visual Basic类似的集合类。”
第197页 - 性能
“事实上,我被Visual Basic开发人员告知Collections是双向链表(具有支持索引的其他功能)。 ”
现在,McKinney更像是记者而不是程序员,也不是开发人员。但是,他确实为Microsoft工作,并且在VB和VBA团队中有联系。他的解释对我有效。
顺便提一下,双向链表之所以高效,是因为它可以在集合的开头和末尾同时插入项。

那么这是否意味着链表和哈希表同时存在,持有对同一项对象的引用?并且根据迭代方式的不同,它会根据需要使用不同的数据结构? - Tom Tresansky
Mark正在描述代码接口,通过它可以访问集合。我们只能推断,在幕后必须有支持功能的东西。我们可以猜测它可能使用链表和哈希表,但我们并不知道。 - MarkJ
@MarkJ:我希望有人能够指向一个资源,消除对实现的猜测。 - Tom Tresansky
@Tom T:我知道,我的观点是这个答案并没有解决问题。 - MarkJ
谢谢你的更新!我觉得这基本上回答了我的问题。 - Tom Tresansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接