2012-05-31 35 views
4

最近我发现,没有内置可可队列(触摸,在这种情况下)。为什么不?队列是计算机编程中最基本的数据结构之一。为什么Cocoa中没有队列?

我见过一些人建议使用NSMutableArray,但这对于弹出/退出非常低效,因为它需要移除索引0处的对象。这会将所有元素向下移动(朝向现在为空的条目),因此每次移除操作需要O(n)个时间。我是否错过了某些东西,或者有没有理由说队列没有添加到可可?

+7

“不要再猜苹果,因为苹果已经第二次猜到了你,当然,这是一个好方法。” http://ridiculousfish.com/blog/posts/array.html – vikingosegundo

+0

@vikingosegundo伟大的阅读 - 感谢分享。 – Till

+0

@Till看到我的回复,我张贴了一些信息,通过查看CFArray和CFStorage的源文件找到。 – vikingosegundo

回答

12

我见过一些人建议使用NSMutableArray,但这是弹出/出队极其低效的,因为它需要在索引0去除对象将转移所有元素向下(朝现空条目),因此每个删除操作需要O(n)个时间。

这是不正确的。 NSMutableArray可非常有效地处理头部插入,并可用于许多不同的数据结构,包括队列和堆栈。

4

AFAIK的NSMutableArray中使用循环缓冲区内,所以我认为这是相当正常使用的队列。

8

苹果发布的CFTypes作为开源 - 和他们的核心数据类型的面向对象的集合作为的NSArray,NSDictionary的,......(“免费电话桥接”)

因此,如果我们看看CFArray.c我们只需查看包含#include "CFStorage.h"即可看到。这必须是真实存储数据的类型。

ok了,在看看CFStorage.h,我们发现这在它的评论

CFStorage使用平衡树来存储的值,并且是最 适合那种潜在的大量的值 情况(更一百个字节的价值)将被保存,都会有很多 编辑(插入和删除)的。

获取一个项目是O(log n)的,虽然高速缓存的最后结果往往降低此 到一个恒定的时间。

ERGO
命名为“NS(可变)阵列”没有介绍,它是如何实现的,但它是如何工作在更高的层次。而且实现要复杂得多,而不仅仅是一个列表,数组意味着。


我们不知道,如果进入封闭源代码的时候,所以不是所有的事情可能会通过查看CFTypes来源可以解释苹果正在改变CFTypes。

一些数字和图表:http://ridiculousfish.com/blog/posts/array.html

+1

很好解释。当然,没有理由说NeXT/Apple(或者Nosrettap!)不能在底层结构中添加另一个高级接口“NS [Mutable] Queue”。 –

0

不难写围绕NSMutableArray的小包装和使用,作为一个队列。苹果建议这样做。我有我写这里的实施要做到这一点

至于为什么苹果决定不这样做。谁知道,这是基金会框架工程师的问题。

相关问题