【问题标题】:Why is there no queue in Cocoa?为什么 Cocoa 中没有队列?
【发布时间】:2012-05-31 13:08:44
【问题描述】:

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

我看到有人建议使用NSMutableArray,但这对于pops/dequeues来说效率极低,因为它需要删除索引0处的对象。这会将所有元素向下移动(朝向现在为空的entry),因此每个删除操作花费 O(n) 时间。是我遗漏了什么还是没有理由没有将队列添加到 Cocoa 中?

【问题讨论】:

  • “不要第二次猜测苹果,因为苹果已经第二次猜测了你。当然,这是一种很好的方式。” ridiculousfish.com/blog/posts/array.html
  • @vikingosegundo 精彩阅读 - 感谢分享。
  • @直到看到我的答案,我通过查看 CFArray 和 CFStorage 的源文件找到了一些信息。

标签: cocoa-touch cocoa data-structures queue


【解决方案1】:

我看到一些人建议使用NSMutableArray,但这对于弹出/出列非常低效,因为它需要删除索引 0 处的对象。这会将所有元素向下移动(朝向现在为空的entry),因此每个删除操作需要 O(n) 时间。

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

【讨论】:

    【解决方案2】:

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

    因此,如果我们查看CFArray.c,我们只需查看包含#include "CFStorage.h" 就可以看到。这必须是真正让数据感到痛苦的类型。

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

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

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

    所以
    “NS(Mutable)Array”这个名称并没有描述它是如何实现的,而是它在更高级别上是如何工作的。而且实现比数组所暗示的列表要复杂得多。

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

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

    【讨论】:

    • 很好解释。当然,NeXT/Apple(或 Nosrettap!)没有理由不能在底层结构中添加另一个高级接口 NS[Mutable]Queue
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      至于为什么苹果决定不这样做。谁知道呢,这是 Foundation Framework 工程师的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2010-12-26
        相关资源
        最近更新 更多