【发布时间】:2012-06-28 15:08:28
【问题描述】:
在 Java 中有一个很好的库类 java.util.Stack,它实现了 push 和 pop 方法。 Objective C 中有类似的东西吗?
我只找到了 MutableArray。看起来很奇怪,我必须实现像堆栈这样的基本东西,必须有“NSStack”、“NSQueue”和其他类似的东西。
【问题讨论】:
标签: objective-c nsmutablearray stack
在 Java 中有一个很好的库类 java.util.Stack,它实现了 push 和 pop 方法。 Objective C 中有类似的东西吗?
我只找到了 MutableArray。看起来很奇怪,我必须实现像堆栈这样的基本东西,必须有“NSStack”、“NSQueue”和其他类似的东西。
【问题讨论】:
标签: objective-c nsmutablearray stack
你(和我一样)可能会担心使用 NSMutableArray 的出队性能,因为在出队时你必须移除 NSMutableArray 中的第一个对象,而移除会导致数组中所有对象的移位。这不是必需的,但是根据我所做的测试here:对于包含 100000 个对象的 NSMutableArray,通过连续删除第一个对象来删除所有对象比连续删除最后一个对象慢 100 毫秒。我还将使用一个 NSMutableArray 与使用两个 NSMutableArray 进行了比较。虽然可以通过使用两个用作两个堆栈的 NSMutableArrays 来避免删除第一个对象,但双堆栈解决方案实际上速度较慢。
【讨论】:
没有人应该忘记 Objective-C 提供了一个非常好的变体:Objective-C++。并且 C++ 标准库提供了您需要的、经过良好测试、调试、稳定且尽可能快的数据结构。最好,他们将与 ARC 完美配合。最好的是,您甚至可以在__weak 或__strong 指针之间进行选择,如果您感觉的话。
看看<queue> 和<stack>。
也就是说,NSMutableArray 非常适合堆栈:-addObject:、-lastObject 和 -removeLastObject 会以良好的性能很好地完成这项工作。
C++ 可能很冗长。非常冗长。但它也到处都有一些优雅,以及一些非常强大的结构。标准库的某些部分真正闪耀,一旦掌握了外星语法,数据结构就是其中的明珠。无论如何,它可以用一些 typedef 隐藏。
【讨论】:
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothRFCOMMChannel", referenced from: objc-class-ref in BluetoothRfcommPort.o 所以,有时它不是使用 Obj-C++ 的选择,除非我遗漏了什么。
据我所知,sdk 中没有堆栈和队列之类的东西。
有一个队列实现的例子here。
【讨论】:
我有一个堆栈实现here。它使用NSMutableArray 来做脏活,这真的不是那么糟糕。但是 Foundation 中没有内置任何内容。
【讨论】:
NSMutableArray 就可以了。