【问题标题】:Objective C NSStack and NSQueue?目标 C NSStack 和 NSQueue?
【发布时间】:2012-06-28 15:08:28
【问题描述】:

在 Java 中有一个很好的库类 java.util.Stack,它实现了 push 和 pop 方法。 Objective C 中有类似的东西吗?

我只找到了 MutableArray。看起来很奇怪,我必须实现像堆栈这样的基本东西,必须有“NSStack”、“NSQueue”和其他类似的东西。

【问题讨论】:

标签: objective-c nsmutablearray stack


【解决方案1】:

你(和我一样)可能会担心使用 NSMutableArray 的出队性能,因为在出​​队时你必须移除 NSMutableArray 中的第一个对象,而移除会导致数组中所有对象的移位。这不是必需的,但是根据我所做的测试here:对于包含 100000 个对象的 NSMutableArray,通过连续删除第一个对象来删除所有对象比连续删除最后一个对象慢 100 毫秒。我还将使用一个 NSMutableArray 与使用两个 NSMutableArray 进行了比较。虽然可以通过使用两个用作两个堆栈的 NSMutableArrays 来避免删除第一个对象,但双堆栈解决方案实际上速度较慢。

【讨论】:

    【解决方案2】:

    没有人应该忘记 Objective-C 提供了一个非常好的变体:Objective-C++。并且 C++ 标准库提供了您需要的、经过良好测试、调试、稳定且尽可能快的数据结构。最好,他们将与 ARC 完美配合。最好的是,您甚至可以在__weak__strong 指针之间进行选择,如果您感觉的话。

    看看<queue><stack>

    也就是说,NSMutableArray 非常适合堆栈:-addObject:-lastObject-removeLastObject 会以良好的性能很好地完成这项工作。

    C++ 可能很冗长。非常冗长。但它也到处都有一些优雅,以及一些非常强大的结构。标准库的某些部分真正闪耀,一旦掌握了外星语法,数据结构就是其中的明珠。无论如何,它可以用一些 typedef 隐藏。

    【讨论】:

    • 没有,但是一个关于如何使用objective-C .m 文件中的 的小 lil 代码示例不会受到伤害;)
    • 有一个问题 - C++ 类仅在 .mm 文件中可用,一旦我将 .m 重命名为 .mm,XCode 8 编译器就会突然开始向我发送一些头文件的链接错误信息正在使用,例如Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothRFCOMMChannel", referenced from: objc-class-ref in BluetoothRfcommPort.o 所以,有时它不是使用 Obj-C++ 的选择,除非我遗漏了什么。
    【解决方案3】:

    据我所知,sdk 中没有堆栈和队列之类的东西。
    有一个队列实现的例子here

    【讨论】:

      【解决方案4】:

      我有一个堆栈实现here。它使用NSMutableArray 来做脏活,这真的不是那么糟糕。但是 Foundation 中没有内置任何内容。

      【讨论】:

      • 是的,太真实了!很高兴你发现它有用。基本上 - 你可能不需要队列或堆栈,只需使用 NSMutableArray 就可以了。
      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多