代码之家  ›  专栏  ›  技术社区  ›  George Armhold

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

  •  8
  • George Armhold  · 技术社区  · 15 年前

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

    6 回复  |  直到 10 年前
        1
  •  10
  •   Matt Bridges    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
    
        2
  •  5
  •   Community Alex Howansky    7 年前

    Cocoa本身没有队列类,本身也没有标准,但是有几个选项,其中一个最适合您的需要。见 this question (和) my answer )

    就像你说的,你可以用非诱变数组自己滚动。如果您只需要一个快速的、不脏的队列(并且不担心复制、编码/解码、枚举等),那么@matt建议的解决方案是一种简单的方法。你也应该考虑 adding queue methods to NSMutableArray via a category 这是很好的,因为您的“队列”也是一个数组(因此您可以为ns array参数传递它),并且您可以免费获得所有的ns(可变)数组功能。

    如果性能很重要,我建议使用更适合删除第一个元素的结构。我写 CHCircularBufferQueue 因为我自己的框架。(不是自吹自擂,只是想节省一些时间。)

        3
  •  1
  •   neoneye    14 年前

    我已经创建了一个只包含Deque方法的类别,基于MattBridges代码。

    @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
    
        4
  •  0
  •   Nick Strupat    14 年前

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

        5
  •  0
  •   Gordon Childs    13 年前

    退房 STL priority queue . 它需要零行代码,而且是可移植的!你还想要什么?

        6
  •  0
  •   Hurshai    10 年前

    您可以使用nsarray的:lastObject方法。以下是一个未经测试的示例:

    排队

    #import <Foundation/Foundation.h>
    
    @interface Queue : NSObject
    
    -(void)enqueue:(id)object;
    -(id)dequeue;
    
    @end
    

    队列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