如何在目标C中建立和使用队列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我想在我的Objective-C程序中使用队列数据结构。在C ++中,我会使用STL队列。Objective-C中的等效数据结构是什么?

提问于
用户回答回答于

NSMutableArray里+ QueueAdditions.h

@interface NSMutableArray (QueueAdditions)
- (id) dequeue;
- (void) enqueue:(id)obj;
@end

NSMutableArray里+ QueueAdditions.m

@implementation NSMutableArray (QueueAdditions)
// Queues are first-in-first-out, so we remove objects from the head
- (id) dequeue {
    // if ([self count] == 0) return nil; // to avoid raising exception (Quinn)
    id headObject = [self objectAtIndex:0];
    if (headObject != nil) {
        [[headObject retain] autorelease]; // so it isn't dealloc'ed on remove
        [self removeObjectAtIndex:0];
    }
    return headObject;
}

// Add to the tail of the queue (no one likes it when people cut in line!)
- (void) enqueue:(id)anObject {
    [self addObject:anObject];
    //this method automatically adds to the end of the array
}
@end

只要将.h文件导入到任何想要使用新方法的位置,并像调用其他任何NSMutableArray方法那样调用它们即可。

用户回答回答于

我不会说使用NSMutableArray必然是最好的解决方案,特别是如果你添加了具有类别的方法,由于它们在方法名称冲突时可能导致的脆弱性。对于quick-n-dirty队列,我会使用这些方法在可变数组的末尾添加和删除。但是,如果您打算重用队列,或者希望代码更具可读性和不言而喻,那么专用的队列类可能就是您想要的。

可可没有内置的,但还有其他的选择,你也不必从头开始编写一个。对于只从端点添加和删除的真正队列,循环缓冲区数组是一个非常快速的实现。查看CHDataStructures.framework,这是我一直在研究的Objective-C中的一个库/框架。它具有各种各样的队列实现,以及栈,deques,排序集等。为了你的目的,CHCircularBufferQueue比使用NSMutableArray快得多(即可用基准测试证明)并且可读性更强(当然是主观的)。

使用本地Objective-C类而不是C ++ STL类的一大优势是它可以与Cocoa代码无缝集成,并且在编码/解码(序列化)方面效果更好。它也适用于垃圾收集和快速枚举(两者都出现在10.5+中,但在iPhone上只有后者),并且不必担心什么是Objective-C对象和什么是C ++对象。

最后,虽然NSMutableArray在添加和从两端删除时都比标准C数组好,但它也不是队列中最快的解决方案。对于大多数应用程序来说它是令人满意的,但是如果你需要速度,一个循环缓冲区(或者在某些情况下为了保持高速缓存线而优化的链接列表)可能会轻易地给NSMutableArray带来麻烦。

扫码关注云+社区