我最近发现Cocoa中没有内置队列(在本例中为Touch)。为什么不?队列是计算机编程中最基本的数据结构之一。
我见过一些人建议使用NSMutableArray
,但这对于pops / dequeues来说效率极低,因为它需要删除索引0处的对象。这会将所有元素向下移动(朝向现在为空条目),因此每次删除操作需要O(n)时间。我错过了什么,或者没有理由没有将队列添加到Cocoa中?
答案 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来源并不是所有事情都可以解释。
答案 2 :(得分:4)
AFAIK NSMutableArray在内部使用循环缓冲区,所以我认为可以用于队列。
答案 3 :(得分:0)
在NSMutableArray周围编写一个小包装并将其用作队列并不困难。 Apple建议这样做。我有一个我在这里写的实现
https://github.com/Machx/Zangetsu/blob/master/Source/CWQueue.m
至于为什么Apple决定不这样做。谁知道,这对基金会框架工程师来说是一个问题。