Существует ли структура данных Queue / FIFO для iPhone? - PullRequest
8 голосов
/ 09 июля 2009

Прежде чем я выполнил свою собственную Очередь , используя NSMutableArray, я хотел бы знать, есть ли что-то более стандартное доступное. Я ничего не вижу в документации Apple, но я буду удивлен, если не будет реализации Queue откуда-то, что люди используют. Ява портит меня!

Ответы [ 6 ]

10 голосов
/ 09 июля 2009

Реализация очереди, основанной на NSMutableArray, довольно проста, вероятно, она содержит менее 50 строк кода.

EDIT:

Нашел это с помощью быстрого поиска в Google:

@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
5 голосов
/ 10 июля 2009

Какао само по себе не имеет класса Queue, и стандарта как такового нет, но есть несколько вариантов, один из которых может лучше всего соответствовать вашим потребностям. См. этот вопрос мой ответ ).

Как вы сказали, вы можете свернуть свои собственные, используя NSMutableArray. Если вам просто нужна быстрая очередь с ошибками (и вы не беспокоитесь о копировании, кодировании / декодировании, перечислении и т. Д.), То решение @Matt предлагает простой подход. Вам также следует рассмотреть возможность добавления методов очереди к NSMutableArray через категорию , что приятно, поскольку ваша «очередь» также является массивом (так что вы можете передать ее для параметров NSArray), и вы получите все NS (Mutable) Array функциональность бесплатно.

Если важна производительность, я рекомендую использовать структуру, которая идеально подходит для удаления первого элемента. Я написал CHCircularBufferQueue для моей собственной структуры по этой самой причине. (Не пытаясь зацепить мой собственный рог, просто пытаясь спасти других некоторое время.)

1 голос
/ 12 июня 2010

Я создал категорию, содержащую только метод 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
0 голосов
/ 18 мая 2014

Вы можете использовать: lastObject метод NSArray. Вот непроверенный пример:

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
0 голосов
/ 25 июня 2011

Извлечение очереди приоритета STL . Требуется ноль строк кода и он переносим! Что еще можно хотеть?

0 голосов
/ 12 июня 2010

Вы можете использовать очередь STL из стандартной библиотеки C ++.

...