2009-07-09 5 views

Répondre

10

L'implémentation d'une file d'attente basée sur NSMutableArray est assez facile, c'est probablement moins de 50 lignes de code.

EDIT:

trouvé cela avec une recherche rapide 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 
+1

+1 Je nettoyais le formatage du code un peu, et la méthode -takeObject. –

+0

ajouter un [release d'objets] sur votre dealloc un je vais vous donner un +1 – slf

+0

Une meilleure implémentation serait une liste chaînée. Avec une liste chaînée, vous pouvez optimiser le temps passé à effectuer chaque opération sur O (1). Avec NSMutableArray, vous avez une opération O (n) pour chaque takeObject (removeObjectAtIndex décale tous les éléments). – George

5

cacao lui-même n'a pas de classe de file d'attente, et il n'y a pas une norme en soi, mais il y a plusieurs options, un de qui peut le mieux répondre à vos besoins. Voir this question (et my answer).

Comme vous l'avez dit, vous pouvez rouler le vôtre en utilisant NSMutableArray. Si vous avez juste besoin d'une file d'attente rapide (et ne vous inquiétez pas de la copie, de l'encodage/décodage, de l'énumération, etc.) alors la solution suggérée par @Matt est une approche facile. Vous devriez également considérer adding queue methods to NSMutableArray via a category, ce qui est bien dans le sens où votre "queue" est également un tableau (vous pouvez donc le passer pour les paramètres NSArray), et vous obtenez toute la fonctionnalité NS (Mutable) Array gratuitement.

Si la performance est importante, je recommande d'utiliser une structure plus idéale pour enlever le premier élément. J'ai écrit CHCircularBufferQueue pour mon propre cadre pour cette raison même. (Je n'essaie pas de taper mon propre cor, essayant simplement de sauver les autres.)

1

J'ai créé une catégorie contenant uniquement la méthode deque, basée sur le code 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 
0

Vous pouvez utiliser la file d'attente STL à partir de la bibliothèque standard C++.

0

Consultez le STL priority queue. Il nécessite zéro lignes de code et c'est portable! Que pourrais-tu vouloir de plus?

+0

sécurité des threads;) – Michael

0

Vous pouvez utiliser la méthode: lastObject de NSArray. Voici un exemple non testé:

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 
Questions connexes