Je souhaite utiliser une structure de données de file d'attente dans mon programme Objective-C. En C ++, j'utiliserais la file d'attente STL. Quelle est la structure de données équivalente en Objective-C? Comment pousser / faire apparaître des éléments?
objective-c
cocoa
data-structures
queue
MrDatabase
la source
la source
-count
avance pour vérifier s'il y a des objets à retirer de la file d'attente. C'est vraiment une question de préférence.Je ne dirais pas que l'utilisation de NSMutableArray est nécessairement la meilleure solution, en particulier si vous ajoutez des méthodes avec des catégories, en raison de la fragilité qu'elles peuvent causer si les noms de méthodes entrent en collision. Pour une file d'attente rapide et sale, j'utiliserais les méthodes pour ajouter et supprimer à la fin d'un tableau mutable. Cependant, si vous prévoyez de réutiliser la file d'attente, ou si vous voulez que votre code soit plus lisible et plus évident, une classe de file d'attente dédiée est probablement ce que vous voulez.
Cocoa n'en a pas intégré, mais il existe d'autres options, et vous n'avez pas non plus à en écrire une à partir de zéro. Pour une vraie file d'attente qui ajoute et supprime uniquement des extrémités, un tableau de tampons circulaire est une implémentation extrêmement rapide. Découvrez CHDataStructures.framework , une bibliothèque / framework en Objective-C sur laquelle j'ai travaillé. Il a une variété d'implémentations de files d'attente, ainsi que des piles, des deques, des ensembles triés, etc. Pour vos besoins, CHCircularBufferQueue est beaucoup plus rapide (c'est-à-dire prouvable avec des benchmarks) et plus lisible (certes subjectif) que l'utilisation d'un NSMutableArray.
Un gros avantage de l'utilisation d'une classe Objective-C native au lieu d'une classe C ++ STL est qu'elle s'intègre parfaitement au code Cocoa et fonctionne beaucoup mieux avec l'encodage / décodage (sérialisation). Cela fonctionne également parfaitement avec le garbage collection et l'énumération rapide (tous deux présents dans 10.5+, mais uniquement ce dernier sur iPhone) et vous n'avez pas à vous soucier de ce qu'est un objet Objective-C et de ce qu'est un objet C ++.
Enfin, bien que NSMutableArray soit meilleur qu'un tableau C standard lors de l'ajout et de la suppression de chaque extrémité, ce n'est pas non plus la solution la plus rapide pour une file d'attente. Pour la plupart des applications, c'est satisfaisant, mais si vous avez besoin de vitesse, un tampon circulaire (ou dans certains cas une liste chaînée optimisée pour garder les lignes de cache à chaud) peut facilement écraser un NSMutableArray.
la source
Autant que je sache, Objective-C ne fournit pas de structure de données de file d'attente. Votre meilleur pari est de créer un
NSMutableArray
, et utiliser ensuite[array lastObject]
,[array removeLastObject]
pour aller chercher l'élément, et[array insertObject:o atIndex:0]
...Si vous faites beaucoup cela, vous voudrez peut-être créer une catégorie Objective-C pour étendre les fonctionnalités de la
NSMutableArray
classe. Les catégories vous permettent d'ajouter dynamiquement des fonctions aux classes existantes (même celles dont vous n'avez pas la source) - vous pouvez en créer une comme celle-ci:(REMARQUE: ce code est en fait pour une pile, pas une file d'attente. Voir les commentaires ci-dessous)
la source
Il n'y a pas de vraie classe de collections de files d'attente, mais NSMutableArray peut être utilisé pour la même chose. Vous pouvez définir une catégorie pour ajouter des méthodes pop / push si vous le souhaitez.
la source
Oui, utilisez NSMutableArray. NSMutableArray est en fait implémenté sous la forme d'un arbre 2-3; vous n'avez généralement pas besoin de vous préoccuper des caractéristiques de performance de l'ajout ou de la suppression d'objets de NSMutableArray à des index arbitraires.
la source
re: Wolfcow - Voici une implémentation corrigée de la méthode de file d'attente de Wolfcow
la source
Les solutions qui utilisent une catégorie sur
NSMutableArray
ne sont pas de vraies files d'attente, car ellesNSMutableArray
exposent des opérations qui sont un sur-ensemble de files d'attente. Par exemple, vous ne devriez pas être autorisé à supprimer un élément du milieu d'une file d'attente (comme ces solutions de catégorie vous le permettent toujours). Il est préférable d'encapsuler la fonctionnalité, un principe majeur de la conception orientée objet.StdQueue.h
StdQueue.m
la source
c'est ma mise en œuvre, j'espère que cela aide.
Est un peu minimaliste, vous devez donc garder la trace de la tête en sauvegardant la nouvelle tête au pop et en jetant l'ancienne tête
la source
Y a-t-il une raison particulière pour laquelle vous ne pouvez pas simplement utiliser la file d'attente STL? Objective C ++ est un sur-ensemble de C ++ (utilisez simplement .mm comme extension au lieu de .m pour utiliser Objective C ++ au lieu d'Objective C). Ensuite, vous pouvez utiliser la STL ou tout autre code C ++.
Un problème lié à l'utilisation de la file d'attente / vecteur / liste STL avec des objets Objective C est qu'ils ne prennent généralement pas en charge la gestion de la mémoire de conservation / libération / libération automatique. Cela est facilement contourné avec une classe de conteneur C ++ Smart Pointer qui conserve son objet Objective C lorsqu'il est construit et le libère lorsqu'il est détruit. En fonction de ce que vous mettez dans la file d'attente STL, cela n'est souvent pas nécessaire.
la source
Utilisez NSMutableArray.
la source