2012-06-27 2 views
7

In Java c'è una bella classe di libreria java.util.Stack che implementa metodi push e pop. C'è qualcosa di simile nell'obiettivo C?Obiettivo C NSStack e NSQueue?

Ho trovato solo MutableArray. Sembra strano che dovrei implementare una cosa di base come uno stack, ci deve essere qualcosa come "NSStack", "NSQueue" e altre cose simili.

+0

possibile duplicato di [SDK iOS fornisce code e stack?] (Http://stackoverflow.com/questions/3652709/does-the-ios-sdk-provide-queues-and-stacks) – mattjgalloway

risposta

9

Ho un'implementazione stack here. Usa NSMutableArray per fare il lavoro sporco che non è poi così male. Ma non c'è nulla di costruito nella Fondazione.

+2

grazie, davvero sembra abbastanza facile. Java rende le persone pigre :) – iseeall

+1

Sì, troppo vero! Mi fa piacere che l'abbia trovato utile. Fondamentalmente - probabilmente non hai bisogno di una coda o di uno stack, usa solo un 'NSMutableArray' e starai bene. – mattjgalloway

1

per quanto ne so, non c'è niente come stack e coda nello sdk.
c'è un esempio per implementare la coda here.

18

Nessuno dovrebbe dimenticare Objective-C offre una variante molto carina: Objective-C++. E la libreria standard C++ fornisce le strutture di dati necessarie, ben collaudate, debuggate, stabili e quanto più veloci possibile. Meglio, lavoreranno perfettamente con ARC. Il meglio, puoi anche scegliere tra __weak o __strong puntatori se ti senti.

Dai un'occhiata a <queue> e <stack>.

Detto questo, NSMutableArray funziona perfettamente bene per pile: -addObject:, -lastObject e -removeLastObject farà il lavoro bene con buone prestazioni.

C++ può essere prolisso. Orribilmente prolisso. Ma ha anche un po 'di eleganza qua e là, e alcuni costrutti molto potenti. Alcune parti della libreria standard brillano davvero, e le strutture dati sono tra le perle una volta che la sintassi aliena è stata padroneggiata. Può essere comunque nascosto con alcuni typedef.

+3

Gli odiatori di C++ in giro? –

+2

Solo un minuscolo esempio di codice per l'utilizzo di da un file Cm obiettivo non danneggerebbe;) – xaphod

+0

C'è un problema: le classi C++ sono disponibili solo nei file .mm e non appena rinominerò my .m to .mm, il compilatore XCode 8 inizia improvvisamente a inviare spam con errori di collegamento per alcune intestazioni che sto usando, ad es. 'Simboli indefiniti per l'architettura x86_64: " _OBJC_CLASS _ $ _ IOBluetoothRFCOMMChannel ", referenziato da: objc-class-ref in BluetoothRfcommPort.o' Quindi, a volte non è un'opzione per andare a Obj-C++, a meno che manchi qualcosa. – JustAMartin

1

L'utente (come il sottoscritto) potrebbe preoccuparsi delle prestazioni di eliminazione dell'uso di NSMutableArray, poiché in modalità dequeue è necessario rimuovere il primo oggetto in NSMutableArray e la rimozione causerà lo spostamento di tutti gli oggetti nell'array. Tuttavia, ciò non è necessario in base al test che ho effettuato here: per un NSMutableArray contenente 100000 oggetti, rimuovere tutti gli oggetti rimuovendo continuamente il primo oggetto è 100 ms più lento che rimuovendo continuamente l'ultimo oggetto. Ho anche confrontato l'utilizzo di un NSMutableArray con l'utilizzo di due NSMutableArray. Sebbene sia possibile evitare di rimuovere il primo oggetto utilizzando due NSMutableArrays che vengono utilizzati come due stack, la soluzione a doppio stack è in realtà più lenta.