Ich möchte eine Warteschlangendatenstruktur in meinem Objective-C-Programm verwenden. In C ++ würde ich die STL-Warteschlange verwenden. Was ist die äquivalente Datenstruktur in Objective-C? Wie kann ich Artikel pushen / platzen lassen?
objective-c
cocoa
data-structures
queue
MrDatabase
quelle
quelle
-count
vorher anrufen , um zu überprüfen, ob Objekte in die Warteschlange gestellt werden müssen. Es ist wirklich eine Frage der Präferenz.Ich würde nicht sagen, dass die Verwendung von NSMutableArray unbedingt die beste Lösung ist, insbesondere wenn Sie Methoden mit Kategorien hinzufügen, da diese bei der Kollision von Methodennamen fragil sein können. Für eine Quick-n-Dirty-Warteschlange würde ich die Methoden verwenden, um am Ende eines veränderlichen Arrays etwas hinzuzufügen und zu entfernen. Wenn Sie jedoch vorhaben, die Warteschlange wiederzuverwenden, oder wenn Sie möchten, dass Ihr Code besser lesbar und selbstverständlich ist, ist wahrscheinlich eine dedizierte Warteschlangenklasse genau das, was Sie möchten.
In Cocoa ist keine integriert, aber es gibt andere Optionen, und Sie müssen auch keine von Grund auf neu schreiben. Für eine echte Warteschlange, die nur an den Enden hinzugefügt und entfernt wird, ist ein kreisförmiges Pufferarray eine extrem schnelle Implementierung. Schauen Sie sich CHDataStructures.framework an , eine Bibliothek / ein Framework in Objective-C, an dem ich gearbeitet habe. Es verfügt über eine Vielzahl von Implementierungen von Warteschlangen sowie von Stapeln, Deques, sortierten Mengen usw. Für Ihre Zwecke CHCircularBufferQueue ist erheblich schneller (dh mit Benchmarks nachweisbar) und lesbarer (zugegebenermaßen subjektiv) als die Verwendung eines NSMutableArray.
Ein großer Vorteil der Verwendung einer nativen Objective-C-Klasse anstelle einer C ++ STL-Klasse besteht darin, dass sie sich nahtlos in Cocoa-Code integriert und beim Codieren / Decodieren (Serialisierung) viel besser funktioniert. Es funktioniert auch perfekt mit Garbage Collection und schneller Aufzählung (beide in 10.5+ vorhanden, aber nur letztere auf dem iPhone) und Sie müssen sich keine Gedanken darüber machen, was ein Objective-C-Objekt und was ein C ++ - Objekt ist.
Obwohl NSMutableArray beim Hinzufügen und Entfernen an beiden Enden besser als ein Standard-C-Array ist, ist es auch nicht die schnellste Lösung für eine Warteschlange. Für die meisten Anwendungen ist es zufriedenstellend, aber wenn Sie Geschwindigkeit benötigen, kann ein zirkulärer Puffer (oder in einigen Fällen eine verknüpfte Liste, die optimiert ist, um die Cache-Zeilen heiß zu halten) ein NSMutableArray leicht ausschalten.
quelle
Soweit ich weiß, bietet Objective-C keine Warteschlangendatenstruktur. Ihre beste Wette ist es, einen zu erstellen
NSMutableArray
und dann zu verwenden[array lastObject]
,[array removeLastObject]
um den Gegenstand zu holen, und[array insertObject:o atIndex:0]
...Wenn Sie dies häufig tun, möchten Sie möglicherweise eine Objective-C-Kategorie erstellen, um die Funktionalität der
NSMutableArray
Klasse zu erweitern. Mit Kategorien können Sie vorhandenen Klassen dynamisch Funktionen hinzufügen (auch solchen, für die Sie keine Quelle haben). Sie können eine Warteschlange wie folgt erstellen:(HINWEIS: Dieser Code ist eigentlich für einen Stapel, nicht für eine Warteschlange. Siehe Kommentare unten)
quelle
Es gibt keine echte Warteschlangensammlungsklasse, aber NSMutableArray kann effektiv für dasselbe verwendet werden. Sie können eine Kategorie definieren , um Pop / Push-Methoden hinzuzufügen, wenn Sie möchten.
quelle
Ja, verwenden Sie NSMutableArray. NSMutableArray ist tatsächlich als 2-3-Baum implementiert . In der Regel müssen Sie sich nicht mit den Leistungsmerkmalen des Hinzufügens oder Entfernens von Objekten zu NSMutableArray an beliebigen Indizes befassen.
quelle
re: Wolfcow - Hier ist eine korrigierte Implementierung der Dequeue-Methode von Wolfcow
quelle
Die Lösungen, für die eine Kategorie verwendet wird,
NSMutableArray
sind keine echten Warteschlangen, daNSMutableArray
Operationen verfügbar gemacht werden, die eine Obermenge von Warteschlangen darstellen. Beispielsweise sollte es Ihnen nicht gestattet sein, ein Element aus der Mitte einer Warteschlange zu entfernen (wie dies bei diesen Kategorielösungen weiterhin möglich ist). Es ist am besten, die Funktionalität zu kapseln, ein Hauptprinzip des objektorientierten Designs.StdQueue.h
StdQueue.m
quelle
Dies ist meine Implementierung, hoffe es hilft.
Ist irgendwie minimalistisch, also müssen Sie die Spur des Kopfes behalten, indem Sie den neuen Kopf beim Pop speichern und den alten Kopf wegwerfen
quelle
Gibt es einen bestimmten Grund, warum Sie die STL-Warteschlange nicht einfach verwenden können? Objective C ++ ist eine Obermenge von C ++ (verwenden Sie einfach .mm als Erweiterung anstelle von .m, um Objective C ++ anstelle von Objective C zu verwenden). Dann können Sie die STL oder einen anderen C ++ - Code verwenden.
Ein Problem bei der Verwendung der STL-Warteschlange / des Vektors / der Liste usw. mit Objective C-Objekten besteht darin, dass sie normalerweise die Speicherverwaltung für Aufbewahrung / Freigabe / Autorelease nicht unterstützen. Dies lässt sich leicht mit einer C ++ Smart Pointer-Containerklasse umgehen, die ihr Objective C-Objekt beim Erstellen beibehält und es bei Zerstörung freigibt. Je nachdem, was Sie in die STL-Warteschlange stellen, ist dies häufig nicht erforderlich.
quelle
Verwenden Sie NSMutableArray.
quelle