107 votes

Comment puis-je faire et utiliser une File d'attente en Objective-C?

Je veux utiliser une file d'attente de la structure des données dans ma Objective-C programme. En C++, j'utilise la STL file d'attente. Quel est l'équivalent de la structure de données en Objective-C? Comment puis-je push/pop articles?

153voto

Wolfcow Points 1997

Ben version est une pile au lieu d'une file d'attente, donc j'ai modifié un peu:

NSMutableArray+QueueAdditions.h

@interface NSMutableArray (QueueAdditions)
- (id) dequeue;
- (void) enqueue:(id)obj;
@end

NSMutableArray+QueueAdditions.m

@implementation NSMutableArray (QueueAdditions)
// Queues are first-in-first-out, so we remove objects from the head
- (id) dequeue {
    // if ([self count] == 0) return nil; // to avoid raising exception (Quinn)
    id headObject = [self objectAtIndex:0];
    if (headObject != nil) {
        [[headObject retain] autorelease]; // so it isn't dealloc'ed on remove
        [self removeObjectAtIndex:0];
    }
    return headObject;
}

// Add to the tail of the queue (no one likes it when people cut in line!)
- (void) enqueue:(id)anObject {
    [self addObject:anObject];
    //this method automatically adds to the end of the array
}
@end

Il suffit d'importer l' .h fichier où vous souhaitez utiliser votre nouvelles méthodes, et appelez-les comme vous le feriez pour tout autre NSMutableArray méthodes.

Bonne chance et continuez sur le Codage!

33voto

Quinn Taylor Points 29688

Je ne dirais pas que l'utilisation de NSMutableArray est nécessairement la meilleure solution, surtout si vous êtes en train d'ajouter des méthodes avec des catégories, en raison de la fragilité, ils peuvent provoquer de si les noms de méthode entrent en collision. Pour un quick-n-sale file d'attente, je serais d'utiliser les méthodes d'ajouter et de supprimer à la fin d'une mutable tableau. Toutefois, si vous prévoyez de réutiliser la file d'attente, ou si vous voulez que votre code soit plus lisible et de soi, d'une file de classe est probablement ce que vous voulez.

Le cacao n'a pas construit dans, mais il y a d'autres options, et vous n'avez pas à écrire un à partir de zéro. Pour une vraie file d'attente qui n'ajoute et supprime des extrémités, d'un tampon circulaire de la matrice est une très rapide mise en œuvre. Découvrez CHDataStructures.cadre, une bibliothèque/cadre en Objective-C qui j'ai travaillé. Il a une variété de mises en œuvre de files d'attente, ainsi que des piles, les deques, ensembles classés, etc. Pour vos besoins, CHCircularBufferQueue est nettement plus rapide (c'est à dire prouvable avec des repères) et plus lisible (certes subjective) que d'utiliser un NSMutableArray.

Un grand avantage de l'utilisation d'un natif (Objective-C classe au lieu d'un C++ STL classe, c'est qu'il s'intègre de façon transparente avec le Cacao code, et fonctionne beaucoup mieux avec de codage/décodage (sérialisation). Il fonctionne également parfaitement avec la collecte des ordures et rapide énumération (tous deux présents dans l'10.5+, mais seulement celui-ci sur l'iPhone) et vous n'avez pas à vous soucier de ce qu'est un Objectif-C de l'objet et ce qu'est un objet C++.

Enfin, bien que NSMutableArray est mieux qu'un standard C tableau lors de l'ajout et de la suppression de la fin, c'est pas la solution la plus rapide pour une file d'attente. Pour la plupart des applications, il est satisfaisante, mais si vous avez besoin de vitesse, un tampon circulaire (ou, dans certains cas, une liste liée optimisé pour garder les lignes de cache à chaud) peut facilement écraser un NSMutableArray.

29voto

Ben Gotow Points 7627

Autant que je sache, Objective-C ne fournit pas de File d'attente de la structure de données. Votre meilleur pari est de créer un NSMutableArray, et ensuite utiliser [array lastObject], [array removeLastObject] pour aller chercher de l'élément, et [array insertObject:o atIndex:0]...

Si vous faites cela, vous pouvez créer des Objectifs, de la catégorie C pour étendre les fonctionnalités de l' NSMutableArray classe. Les catégories vous permettent d'ajouter dynamiquement des fonctions dans les classes existantes (même ceux que vous n'avez pas la source) - vous pourriez faire une file d'attente de l'un comme ceci:

(REMARQUE: Ce code est en fait une pile, pas une file d'attente. Voir les commentaires ci-dessous)

@interface NSMutableArray (QueueAdditions)

- (id)pop;
- (void)push:(id)obj;

@end

@implementation NSMutableArray (QueueAdditions)

- (id)pop
{
    // nil if [self count] == 0
    id lastObject = [[[self lastObject] retain] autorelease];
    if (lastObject)
        [self removeLastObject];
    return lastObject;
}

- (void)push:(id)obj
{
     [self addObject: obj];
}

@end

8voto

Marc Charbonneau Points 30464

Il n'y a pas de file d'attente des collections de la classe, mais NSMutableArray peut être utilisé efficacement pour la même chose. Vous pouvez définir une catégorie pour ajouter pop/push méthodes comme une commodité, si vous le souhaitez.

7voto

the fridge owl Points 71

Oui, l'utilisation NSMutableArray. NSMutableArray est effectivement mis en œuvre que 2-3 arbre; normalement vous ne devez pas vous préoccuper avec les caractéristiques de performance de l'ajout ou la suppression d'objets de NSMutableArray arbitraire des indices.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X