为什么会出现在可可没有队列?(Why is there no queue in Cocoa?)

2019-09-17 16:12发布

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

我见过一些人建议使用NSMutableArray ,但这是弹出/出队极其低效的,因为它需要删除索引为0的对象将转移所有元素向下(朝向现在是空的条目),从而考虑O(n)的时间为每个删除操作。 我缺少的东西,或在那里只是没有道理的队列中不加入可可?

Answer 1:

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

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



Answer 2:

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

因此,如果我们看看CFArray.c我们就可以通过查看包括看到#include "CFStorage.h" 。 这必须是疮数据真正的类型。

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

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

前往一个项目是O(log n)的,尽管缓存最后的结果往往降低了这一定的时间。

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

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

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



Answer 3:

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



Answer 4:

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

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

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



文章来源: Why is there no queue in Cocoa?