为什么Cocoa中没有队列?

时间:2012-05-31 13:08:44

标签: cocoa-touch cocoa data-structures queue

我最近发现Cocoa中没有内置队列(在本例中为Touch)。为什么不?队列是计算机编程中最基本的数据结构之一。

我见过一些人建议使用NSMutableArray,但这对于pops / dequeues来说效率极低,因为它需要删除索引0处的对象。这会将所有元素向下移动(朝向现在为空条目),因此每次删除操作需要O(n)时间。我错过了什么,或者没有理由没有将队列添加到Cocoa中?

4 个答案:

答案 0 :(得分:12)

  

我见过一些人建议使用NSMutableArray,但这对于pops / dequeues来说效率极低,因为它需要删除索引0处的对象。这会将所有元素向下移动(朝向现在为空条目),因此每次删除操作需要O(n)时间。

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

答案 1 :(得分:8)

Apple将CFTypes作为OpenSource发布 - 它们是面向对象集合的核心数据类型,如NSArray,NSDictionary,...(“免费桥接”)

因此,如果我们查看CFArray.c,我们可以通过查看包含#include "CFStorage.h"来查看。这必须是将数据分析为真实数据的类型。

好的,看看CFStorage.h,我们在其评论中找到了这个

  

CFStorage使用平衡树来存储值,并且最多   适用于可能存在大量值的情况   (将超过一百字节的价值)将被存储,并将有一个   很多编辑(插入和删除)。

     

获取项目是O(log n),虽然缓存最后的结果通常会减少这一点   到了一个恒定的时间。

<强>麦角
名称“NS(Mutable)Array”没有描述,它是如何实现的,但它是如何在更高层次上工作的。并且实现比数组所暗示的列表要复杂得多。

注意
我们不知道,如果苹果在进入封闭源时正在改变CFType,那么通过查看CFTypes来源并不是所有事情都可以解释。

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

答案 2 :(得分:4)

AFAIK NSMutableArray在内部使用循环缓冲区,所以我认为可以用于队列。

答案 3 :(得分:0)

在NSMutableArray周围编写一个小包装并将其用作队列并不困难。 Apple建议这样做。我有一个我在这里写的实现

https://github.com/Machx/Zangetsu/blob/master/Source/CWQueue.m

至于为什么Apple决定不这样做。谁知道,这对基金会框架工程师来说是一个问题。