是否有iPhone的队列/ FIFO数据结构?

时间:2009-07-09 13:51:19

标签: iphone queue data-structures

在使用NSMutableArray滚动自己的队列之前,我想知道是否有更多标准可用。我没有在Apple文档中看到任何内容,但如果没有人们使用的某个地方没有Queue实现,我会感到惊讶。 Java破坏了我!

6 个答案:

答案 0 :(得分:10)

基于NSMutableArray实现队列非常简单,可能不到50行代码。

编辑:

通过快速谷歌搜索找到了这个:

@interface Queue:NSObject {
   NSMutableArray* objects;
}
- (void)addObject:(id)object;
- (id)takeObject;
@end

@implementation Queue

- (id)init {
   if ((self = [super init])) {
       objects = [[NSMutableArray alloc] init];    
   }
   return self;
}

- (void)dealloc {
    [objects release];
    [super dealloc];
}

- (void)addObject:(id)object {
   [objects addObject:object];
}

- (id)takeObject  {
   id object = nil;
   if ([objects count] > 0) {
       object = [[[objects objectAtIndex:0] retain] autorelease];
       [objects removeObjectAtIndex:0];
   }
   return object;
}

@end

答案 1 :(得分:5)

Cocoa本身没有Queue类,并且本身没有标准,但有几个选项,其中一个可能最适合您的需求。请参阅this question(和my answer)。

就像你说的那样,你可以使用NSMutableArray自己动手。如果你只需要一个quick'n'dirty队列(并且不担心复制,编码/解码,枚举等),那么@Matt建议的解决方案是一种简单的方法。您还应该考虑adding queue methods to NSMutableArray via a category,这很好,因为您的“队列”也是一个数组(因此您可以为NSArray参数传递它),并且您可以免费获得所有NS(Mutable)数组功能。

如果性能很重要,我建议使用更适合删除第一个元素的结构。出于这个原因,我为自己的框架写了CHCircularBufferQueue。 (不是试图嘟嘟我自己的号角,只是试图挽救他人一段时间。)

答案 2 :(得分:1)

我根据Matt Bridges代码创建了一个仅包含deque方法的类别。

@interface NSMutableArray (ShiftExtension)
// returns the first element of self and removes it
-(id)shift;
@end

@implementation NSMutableArray (ShiftExtension)
-(id)shift {
    if([self count] < 1) return nil;
    id obj = [[[self objectAtIndex:0] retain] autorelease];
    [self removeObjectAtIndex:0];
    return obj;
}
@end

答案 3 :(得分:0)

您可以使用C ++标准库中的STL队列。

答案 4 :(得分:0)

查看STL priority queue。它需要零行代码,并且它是可移植的!你还想要什么?

答案 5 :(得分:0)

您可以使用NSArray的:lastObject方法。这是一个未经测试的例子:

Queue.h

#import <Foundation/Foundation.h>

@interface Queue : NSObject

-(void)enqueue:(id)object;
-(id)dequeue;

@end

Queue.m

#import "Queue.h"

@interface Queue()

@property(nonatomic, strong) NSMutableArray *backingArray;

@end

@implementation Queue

-(id)init {
    self = [super init];

    if (self) {
        self.backingArray = [NSMutableArray array];
    }
    return self;
}

-(void)enqueue:(id<NSObject>)object {
    [self.backingArray addObject:object];
}

-(id)dequeue {
    id object = [self.backingArray lastObject];
    [self.backingArray removeObject:object];
    return object;
}

@end