Antes de lanzar mi propia Queue usando NSMutableArray
, me gustaría saber si hay algo más estándar disponible. No veo nada en los documentos de Apple, pero me sorprendería si no hay una implementación de Queue en alguna parte que la gente esté usando. Java me mima!¿Hay una estructura de datos Queue/FIFO para el iPhone?
Respuesta
La implementación de una cola basada en NSMutableArray
es bastante fácil, probablemente esté por debajo de 50 líneas de código.
EDIT:
Encontrado esto con una rápida búsqueda en 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
cacao en sí no tiene una clase de cola, y no hay un sí estándar por, pero hay varias opciones, una de lo que mejor se ajuste a sus necesidades. Ver this question (y my answer).
Como dijo, puede hacer su propio uso de NSMutableArray. Si solo necesita una cola quick'n'dirty (y no está preocupado por copiar, codificar/decodificar, enumerar, etc.), entonces la solución @Matt sugiere que es un enfoque fácil. También debería considerar adding queue methods to NSMutableArray
via a category, lo cual es bueno porque su "cola" también es una matriz (para que pueda pasarla a los parámetros de NSArray), y obtiene todas las funcionalidades de la matriz NS (Mutable) de forma gratuita.
Si el rendimiento es importante, recomiendo utilizar una estructura más adecuada para eliminar el primer elemento. Escribí CHCircularBufferQueue para mi propio framework por este mismo motivo. (No estoy intentando tocar mi propio cuerno, solo estoy tratando de salvar a los demás).
He creado una categoría que contiene solo el método deque, basado en el código de Matt Bridges.
@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
Puede usar la cola STL de la biblioteca estándar de C++.
Echa un vistazo a STL priority queue. ¡Requiere cero líneas de código y es portátil! ¿Qué más podrías querer?
seguridad de hilo;) – Michael
Puede usar el método: lastObject de NSArray. Aquí está un ejemplo no probado:
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
- 1. ¿Hay alguna estructura de datos de gráfico implementada para C#
- 2. ¿Hay una estructura de datos persistente multimap bidireccional?
- 3. ¿Hay una estructura de datos "Establecer" en .Net?
- 4. ¿Hay una estructura de datos como transmisión, pero débil?
- 5. ¿Estructura de datos para almacenar una gran cantidad de datos?
- 6. ¿Hay una función de Matlab para convertir cualquier estructura de datos en una cadena?
- 7. Estructura de datos utilizada para la estructura de directorios?
- 8. Estructura de datos para datos espaciales
- 9. ¿Hay una biblioteca YAML nativa para iPhone?
- 10. ¿Hay una estructura de datos para DAG que admita ediciones eficientes?
- 11. ¿Hay una estructura de datos que contiene conjuntos de datos en .NET?
- 12. base de datos/algoritmo para una estructura de tarifas
- 13. ¿Estructura de datos eficiente para las etiquetas?
- 14. ¿Hay una estructura de datos que no permite duplicados y también mantiene el orden de entrada?
- 15. ¿Hay una estructura de datos como el conjunto de Java en JavaScript?
- 16. Estructura de datos para almacenar matrices dispersas
- 17. Estructura de datos espaciales para juegos
- 18. datos principales en una biblioteca estática para el iPhone
- 19. Estructura de datos para el juego Puntos y cuadros
- 20. Estructura de datos para dados cargados?
- 21. Estructura de datos similar a una matriz simétrica para C++
- 22. Estructura de datos bidireccionales para esta situación
- 23. Estructura de datos para niveles en juegos
- 24. Estructura de datos para un mundo aleatorio
- 25. Estructura de datos para el editor de texto
- 26. ¿Una estructura de datos para mapeos 1: 1 en python?
- 27. ¿Estructura el tipo de datos en php?
- 28. Estructura de datos más rápida para buscar una cadena
- 29. Estructura de datos para almacenar eventos recurrentes?
- 30. Estructura de datos eficiente para la inserción
+1 Limpié el código de formato a un poco, y el método -takeObject. –
agregue un [release de objetos] en su dealloc y le daré un +1 – slf
Una mejor implementación sería una lista enlazada. Con una lista enlazada, puede optimizar el tiempo dedicado a realizar cada operación en O (1). Con NSMutableArray tiene una operación O (n) para cada takeObject (removeObjectAtIndex cambiará todos los elementos). – George