2012-06-27 12 views
7

W Javie znajduje się ładna biblioteka klasy java.util.Stack, która implementuje metody push i pop. Czy jest coś podobnego w Celu C?Cel C NSStack i NSQueue?

Znalazłem tylko MutableArray. Wydaje się dziwne, że musiałbym wdrożyć tak podstawową rzecz, jak stos, musi być coś takiego jak "NSStack", "NSQueue" i inne podobne rzeczy.

+0

możliwy duplikat [Czy zestaw SDK iOS oferuje kolejki i stosy?] (Http://stackoverflow.com/questions/3652709/does-the-ios-sdk-provide-queues-and-stacks) – mattjgalloway

Odpowiedz

9

Mam implementację stosu here. Używa NSMutableArray do brudnej roboty, która tak naprawdę nie jest taka zła. Ale nie ma nic wbudowanego w Fundację.

+2

dzięki, naprawdę wygląda całkiem łatwo. Java sprawia, że ​​ludzie są leniwi :) – iseeall

+1

Tak, zbyt prawdziwe! Cieszę się, że okazało się to przydatne. Zasadniczo - prawdopodobnie nie potrzebujesz kolejki lub stosu, po prostu użyj 'NSMutableArray', a wszystko będzie dobrze. – mattjgalloway

1

o ile wiem, nie ma nic podobnego od stosu i kolejki w SDK.
Istnieje przykład wdrożenia kolejki here.

18

Nikt nie powinien zapomnieć Objective-C oferuje całkiem niezły wariant: Objective-C++. Biblioteka standardowa C++ zapewnia potrzebne struktury danych, dobrze przetestowane, debugowane, stabilne i tak szybko, jak to możliwe. Najlepsze, będą współpracować z ARC perfekcyjnie. Najlepsze, możesz nawet wybrać między wskaźnikami __weak lub __strong, jeśli masz na to ochotę.

Spójrz na <queue> i <stack>.

Powiedział, NSMutableArray działa doskonale na stosach: -addObject:, -lastObject i -removeLastObject będzie wykonać zadanie ładnie z dobrymi wynikami.

C++ może być rozwlekły. Horribly verbose. Ale ma też pewną elegancję tu i tam i kilka bardzo potężnych konstrukcji. Niektóre części standardowej biblioteki naprawdę świecą, a struktury danych należą do pereł po opanowaniu obcej składni. Może być ukryty za pomocą kilku typów.

+3

C++ nienawidzi? –

+2

Nie, ale mały przykład kodu lil z tego, jak używać z pliku C-obiektywu, nie zaszkodzi;) – xaphod

+0

Jest jeden problem - klasy C++ są dostępne tylko w plikach .mm i jak tylko zmienię nazwę mój .m do .mm, kompilator XCode 8 nagle zaczyna spamować mnie z linkami błędów dla niektórych nagłówków, których używam, np. 'Niezdefiniowane symbole dla architektury x86_64: " _OBJC_CLASS _ $ _ IOBluetoothRFCOMMChannel ", do którego odwołuje się: objc-class-ref w BluetoothRccommPort.o' Czasami nie jest to opcja, aby przejść do Obj-C++, Chyba że czegoś brakuje. – JustAMartin

1

Ty (jak ja) możesz martwić się o wydajność usuwania za pomocą NSMutableArray, ponieważ przy usuwaniu danych musisz usunąć pierwszy obiekt z NSMutableArray, a usunięcie spowoduje przesunięcie wszystkich obiektów w tablicy. Nie jest to jednak konieczne w oparciu o test, który wykonałem: here: dla obiektu NSMutableArray zawierającego 100000 obiektów, usuń wszystkie obiekty przez ciągłe usuwanie pierwszego obiektu jest o 100ms wolniejsze niż przez ciągłe usuwanie ostatniego obiektu. Porównałem również użycie jednej NSMutableArray z użyciem dwóch NSMutableArrays. Chociaż możliwe jest uniknięcie usunięcia pierwszego obiektu za pomocą dwóch NSMutableArrays, które są używane jako dwa stosy, rozwiązanie podwójnego stosu jest wolniejsze.