Chcę użyć struktury danych kolejki w moim programie Objective-C. W C ++ użyłbym kolejki STL. Jaka jest równoważna struktura danych w Objective-C? Jak mogę wypchnąć / wyrzucić przedmioty?
objective-c
cocoa
data-structures
queue
MrDatabase
źródło
źródło
-count
wcześniej, aby sprawdzić, czy są jakieś obiekty do usunięcia z kolejki. Tak naprawdę to kwestia preferencji.Nie powiedziałbym, że używanie NSMutableArray jest koniecznie najlepsze rozwiązaniem, szczególnie jeśli dodajesz metody z kategoriami, ze względu na kruchość, jaką mogą powodować kolizja nazw metod. W przypadku kolejki szybkiego i brudnego użyłbym metod dodawania i usuwania na końcu mutowalnej tablicy. Jeśli jednak planujesz ponowne użycie kolejki lub chcesz, aby kod był bardziej czytelny i zrozumiały, prawdopodobnie potrzebujesz dedykowanej klasy kolejki.
Cocoa nie ma wbudowanego, ale są inne opcje i nie musisz też pisać od zera. W przypadku prawdziwej kolejki, która tylko dodaje i usuwa z końców, cykliczna tablica buforów jest niezwykle szybką implementacją. Sprawdź CHDataStructures.framework , bibliotekę / framework w Objective-C, nad którym pracowałem. Ma wiele implementacji kolejek, a także stosów, deques, posortowanych zestawów itp. Do twoich celów CHCircularBufferQueue jest znacznie szybsze (tj. Możliwe do udowodnienia za pomocą testów porównawczych) i bardziej czytelne (wprawdzie subiektywne) niż użycie NSMutableArray.
Dużą zaletą korzystania z natywnej klasy Objective-C zamiast klasy C ++ STL jest to, że integruje się ona bezproblemowo z kodem Cocoa i działa znacznie lepiej z kodowaniem / dekodowaniem (serializacja). Działa również doskonale ze zbieraniem śmieci i szybkim wyliczaniem (oba obecne w 10.5+, ale tylko w tym drugim na iPhonie) i nie musisz się martwić, co jest obiektem Objective-C, a co obiektem C ++.
Wreszcie, chociaż NSMutableArray jest lepsze niż standardowa tablica C podczas dodawania i usuwania z dowolnego końca, nie jest również najszybszym rozwiązaniem dla kolejki. W przypadku większości aplikacji jest to zadowalające, ale jeśli potrzebujesz szybkości, cykliczny bufor (lub w niektórych przypadkach lista połączona zoptymalizowana pod kątem utrzymywania gorących linii pamięci podręcznej) może z łatwością przebić NSMutableArray.
źródło
O ile wiem, Objective-C nie zapewnia struktury danych kolejki. Najlepiej jest utworzyć plik
NSMutableArray
, a następnie użyć go[array lastObject]
,[array removeLastObject]
aby pobrać przedmiot i[array insertObject:o atIndex:0]
...Jeśli często to robisz, możesz chcieć utworzyć kategorię Cel-C, aby rozszerzyć funkcjonalność
NSMutableArray
klasy. Kategorie pozwalają dynamicznie dodawać funkcje do istniejących klas (nawet tych, dla których nie masz źródła) - możesz utworzyć kolejkę w ten sposób:(UWAGA: ten kod w rzeczywistości dotyczy stosu, a nie kolejki. Zobacz komentarze poniżej)
źródło
Nie ma prawdziwej klasy kolekcji kolejek, ale NSMutableArray można skutecznie wykorzystać do tego samego. Jeśli chcesz, możesz zdefiniować kategorię, aby dodać metody pop / push jako wygodę.
źródło
Tak, użyj NSMutableArray. NSMutableArray jest faktycznie zaimplementowany jako 2-3 drzewo; zazwyczaj nie musisz zajmować się charakterystyką wydajności dodawania lub usuwania obiektów z NSMutableArray w dowolnych indeksach.
źródło
re: Wolfcow - Oto poprawiona implementacja metody dequeue Wolfcowa
źródło
Rozwiązania, które używają kategorii na,
NSMutableArray
nie są prawdziwymi kolejkami, ponieważNSMutableArray
ujawniają operacje, które są nadzbiorem kolejek. Na przykład nie powinieneś mieć możliwości usunięcia pozycji ze środka kolejki (ponieważ te rozwiązania kategorii nadal pozwalają). Najlepiej jest hermetyzować funkcjonalność, główną zasadę projektowania obiektowego.StdQueue.h
StdQueue.m
źródło
to jest moja realizacja, mam nadzieję, że to pomoże.
Jest trochę minimalistyczny, więc musisz śledzić głowę, zapisując nową głowę w popie i odrzucając starą
źródło
Czy jest jakiś szczególny powód, dla którego nie możesz po prostu użyć kolejki STL? Objective C ++ jest nadzbiorem języka C ++ (po prostu użyj .mm jako rozszerzenia zamiast .m, aby użyć Objective C ++ zamiast Objective C). Następnie możesz użyć kodu STL lub dowolnego innego kodu C ++.
Jednym z problemów związanych z używaniem kolejki / wektora / listy STL itp. Z obiektami celu C jest to, że zazwyczaj nie obsługują one zarządzania pamięcią typu retain / release / autorelease. Można to łatwo obejść dzięki klasie kontenera C ++ Smart Pointer, która zachowuje swój obiekt Objective C po skonstruowaniu i zwalnia go po zniszczeniu. W zależności od tego, co umieszczasz w kolejce STL, często nie jest to konieczne.
źródło
Użyj NSMutableArray.
źródło