Objective c NSSet实现
这个问题只是出于好奇,但是NSSet是如何实现的呢?它背后的数据结构是什么?添加和删除元素的访问时间是多少?如果让我猜的话,我会说这是某种哈希表/字典数据结构,但在这种情况下,为什么要区分NSSet和NSMutableSet呢?我发现这是对您的问题的一个有趣的答案。苹果的数据结构(Objective c NSSet实现,objective-c,cocoa,nsset,Objective C,Cocoa,Nsset,这个问题只是出于好奇,但是NSSet是如何实现的呢?它背后的数据结构是什么?添加和删除元素的访问时间是多少?如果让我猜的话,我会说这是某种哈希表/字典数据结构,但在这种情况下,为什么要区分NSSet和NSMutableSet呢?我发现这是对您的问题的一个有趣的答案。苹果的数据结构(NSArray,NSSet,NSDictionary,等等)并不是以简单的“标准方式”实现的。在大多数情况下,它们的性能与任何其他数据集的性能相同,但总体而言,它们会自动优化以获得最佳性能。所以,事实上,这很难说。虽然
NSArray
,NSSet
,NSDictionary
,等等)并不是以简单的“标准方式”实现的。在大多数情况下,它们的性能与任何其他数据集的性能相同,但总体而言,它们会自动优化以获得最佳性能。所以,事实上,这很难说。虽然苹果公司在CFArray.h
中提供了关于阵列效率的文档(相当于NSArray
s),但它没有提供关于集合效率的文档,尽管您可以随意浏览/System/Library/Frameworks/CoreFoundation.framework/Headers/
,查看其他数据结构实现
此外,集合和它的可变对应项之间必须有区别,就像
NSString
和NSMutableString
、NSArray
和NSMutableArray
以及NSDictionary
和NSMutableDictionary
之间有区别一样。对于数据结构和字符串(以及其他很少的类),苹果提供了类的“只读”版本以保持通用性,同时还提供了标准的“可变”版本以进行操作。这只是苹果的标准做法。回答你问题的后半部分:拥有不可变版本的一个好处是它允许一个非常快速的复制方法,只需调用retain。正如Bavariage在评论中指出的,苹果实际的CoreFoundation来源也是如此NSSet
是在上面实现的,它的代码是从哈希表模板生成的(就像CFDictionary
的代码一样),使用来完成这项工作
可变性和不可变性之间的区别似乎在于结构中的标志(的第91行),从我目前的阅读来看,这只会影响对函数的调用,例如CfBasichaddValue
;这里有一个简单的易变性检查。然而,Cobbal关于两者之间的复制/保留行为似乎是正确的(我只是还没有读到那么多)
以前:当我对实现细节感到疑惑时,我发现偶尔细读一下源代码是很有趣和有教育意义的。当然,它们根本不能保证像苹果那样实施,但在某些情况下它们会有所帮助。他们的基金会版本:(我希望这是最新的版本。如果不是,请有人纠正我。)c是从哈希表模板生成的机器。集合似乎被实现为散列。@bavariable:太棒了!谢谢你应该把它变成一个恰当的答案,这样它才能得到恰当的关注;请随意编辑您的答案并包含该部分,也许还可以扩展到可变与不可变的内容。@bavariable:谢谢,完成了。这是一本相当不错的书;今晚可能会让我熬夜。如果我回答错了,请告诉我。不变性的另一个好处是:你知道你不能意外(或其他人故意)更改收藏的内容。