2012-06-27 12 views
7

In Java gibt es eine nette Bibliotheksklasse java.util.Stack, die Push- und Pop-Methoden implementiert. Gibt es in Objective C etwas Ähnliches?Ziel C NSStack und NSQueue?

Ich fand nur MutableArray. Es scheint komisch, dass ich so ein grundlegendes Ding wie einen Stapel implementieren muss, es muss etwas wie "NSStack", "NSQueue" und andere ähnliche Sachen geben.

+0

mögliche Duplikate von [Bietet das iOS SDK Warteschlangen und Stacks?] (Http://stackoverflow.com/questions/3652709/does-the-ios-sdk-provide-queues-and-stacks) – mattjgalloway

Antwort

9

Ich habe eine Stack-Implementierung here. Es verwendet NSMutableArray, um die schmutzige Arbeit zu erledigen, die wirklich nicht so schlecht ist. Aber in der Foundation ist nichts eingebaut.

+2

danke, wirklich sieht ziemlich einfach aus. Java macht Leute faul :) – iseeall

+1

Ja, zu wahr! Schön, dass Sie es nützlich fanden. Grundsätzlich - Sie brauchen wahrscheinlich keine Warteschlange oder einen Stapel, verwenden Sie einfach ein 'NSMutableArray' und alles wird gut. – mattjgalloway

1

Soweit ich weiß, gibt es nichts wie Stapel und Warteschlange in der SDK.
gibt es ein Beispiel für die Warteschlangenimplementierung here.

18

Niemand sollte es vergessen Objective-C bietet eine ziemlich schöne Variante: Objective-C++. Und die C++ - Standardbibliothek bietet die Datenstrukturen, die Sie brauchen, getestet, debuggt, stabil und so schnell wie möglich. Am besten, sie arbeiten perfekt mit ARC. Bestest, Sie können sogar zwischen __weak oder __strong Zeigern wählen, wenn Sie es fühlen.

Werfen Sie einen Blick auf <queue> und <stack>.

Das heißt, NSMutableArray funktioniert sehr gut für Stapel: -addObject:, -lastObject und -removeLastObject wird die Arbeit gut mit einer guten Leistung tun.

C++ kann ausführlich sein. Schrecklich ausführlich. Aber es hat auch eine gewisse Eleganz hier und da und einige sehr mächtige Konstrukte. Einige Teile der Standardbibliothek glänzen wirklich, und die Datenstrukturen gehören zu den Perlen, wenn die Alien-Syntax beherrscht wird. Es kann trotzdem mit ein paar Typedefs versteckt werden.

+3

C++ hasst herum? –

+2

Nein, aber ein kleines Lil-Codebeispiel, wie man eine von einer Objective-C .m-Datei verwenden würde nicht weh;) – xaphod

+0

Es gibt ein Problem - C++ - Klassen sind nur in .mm-Dateien verfügbar, und sobald ich umbenenne Mein .m zu .mm, XCode 8-Compiler beginnt plötzlich, mich mit Linking-Fehlern für einige Header zu spammen, die ich verwende, z 'Undefinierte Symbole für Architektur x86_64: " _OBJC_CLASS _ $ _ IOBluetoothRFCOMMChannel ", referenziert von: objc-class-ref in BluetoothRfcommPort.o' Also, manchmal ist es keine Option, um Obj-C++ zu gehen, Es sei denn, ich vermisse etwas. – JustAMartin

1

Sie (wie ich) können sich über die Ausstiegsleistung bei der Verwendung von NSMutableArray Gedanken machen, weil Sie das erste Objekt im NSMutableArray entfernen müssen, und das Entfernen bewirkt eine Verschiebung aller Objekte im Array. Das ist aber nicht nötig, basierend auf dem Test, den ich gemacht habe here: für ein NSMutableArray mit 100000 Objekten, entfernen Sie alle Objekte, indem Sie kontinuierlich das erste Objekt um 100ms langsamer entfernen, als indem Sie das letzte Objekt fortlaufend entfernen. Ich habe auch verglichen, ein NSMutableArray mit zwei NSMutableArrays zu verwenden. Obwohl es möglich ist, das Entfernen des ersten Objekts durch Verwendung von zwei NSMutableArrays, die als zwei Stapel verwendet werden, zu vermeiden, ist die Double-Stack-Lösung tatsächlich langsamer.