Я хочу использовать структуру данных очереди в моей программе Objective-C. В C ++ я бы использовал очередь STL. Какая эквивалентная структура данных в Objective-C? Как мне нажимать / выталкивать предметы?
objective-c
cocoa
data-structures
queue
MrDatabase
источник
источник
-count
заранее, чтобы проверить, есть ли какие-либо объекты для удаления из очереди. На самом деле это вопрос предпочтений.Я бы не сказал, что использование NSMutableArray обязательно является лучшим решением, особенно если вы добавляете методы с категориями из-за хрупкости, которую они могут вызвать, если имена методов конфликтуют. Для быстрой и грязной очереди я бы использовал методы добавления и удаления в конце изменяемого массива. Однако, если вы планируете повторно использовать очередь или хотите, чтобы ваш код был более читабельным и очевидным, вам, вероятно, нужен выделенный класс очереди.
Какао не имеет встроенного, но есть и другие варианты, и вам также не нужно писать его с нуля. Для настоящей очереди, которая только добавляет и удаляет с концов, круговой буферный массив является чрезвычайно быстрой реализацией. Ознакомьтесь с CHDataStructures.framework , библиотекой / фреймворком в Objective-C, над которой я работал. Он имеет множество реализаций очередей, а также стеки, двухсторонние очереди, отсортированные наборы и т. Д. Для ваших целей CHCircularBufferQueue значительно быстрее (т.е. доказывается с помощью тестов) и более читабелен (по общему признанию), чем использование NSMutableArray.
Одним из больших преимуществ использования собственного класса Objective-C вместо класса C ++ STL является то, что он легко интегрируется с кодом Какао и намного лучше работает с кодированием / декодированием (сериализацией). Он также отлично работает со сборкой мусора и быстрым перечислением (оба присутствуют в 10.5+, но только последнее на iPhone), и вам не нужно беспокоиться о том, что такое объект Objective-C и что такое объект C ++.
Наконец, хотя NSMutableArray лучше стандартного массива C при добавлении и удалении с любого конца, это также не самое быстрое решение для очереди. Для большинства приложений это удовлетворительно, но если вам нужна скорость, кольцевой буфер (или в некоторых случаях связанный список, оптимизированный для поддержания горячих строк кеша) может легко выйти из строя NSMutableArray.
источник
Насколько мне известно, Objective-C не предоставляет структуру данных Queue. Лучше всего , чтобы создать
NSMutableArray
, а затем использовать[array lastObject]
,[array removeLastObject]
чтобы забрать товар, и[array insertObject:o atIndex:0]
...Если вы делаете это часто, вы можете создать категорию Objective-C, чтобы расширить функциональность
NSMutableArray
класса. Категории позволяют вам динамически добавлять функции к существующим классам (даже тем, для которых у вас нет источника) - вы можете создать такую очередь:(ПРИМЕЧАНИЕ: этот код на самом деле предназначен для стека, а не для очереди. См. Комментарии ниже)
источник
Реального класса коллекций очередей нет, но NSMutableArray можно эффективно использовать для того же самого. Вы можете определить категорию для добавления методов pop / push для удобства, если хотите.
источник
Да, используйте NSMutableArray. NSMutableArray фактически реализован как 2-3 дерева; вам обычно не нужно беспокоиться о характеристиках производительности при добавлении или удалении объектов из NSMutableArray по произвольным индексам.
источник
re: Wolfcow - Вот исправленная реализация метода удаления из очереди Wolfcow
источник
Решения, использующие категорию
NSMutableArray
, не являются настоящими очередями, потому чтоNSMutableArray
предоставляют операции, которые являются надмножеством очередей. Например, вам не должно быть разрешено удалять элемент из середины очереди (поскольку решения этих категорий по-прежнему позволяют вам это делать). Лучше всего инкапсулировать функциональность, главный принцип объектно-ориентированного дизайна.StdQueue.h
StdQueue.m
источник
это моя реализация, надеюсь, поможет.
Является своего рода минималистичным, поэтому вы должны отслеживать голову, сохраняя новую голову при появлении и отбрасывая старую.
источник
Есть ли какая-то конкретная причина, по которой вы не можете просто использовать очередь STL? Objective C ++ - это надмножество C ++ (просто используйте .mm в качестве расширения вместо .m, чтобы использовать Objective C ++ вместо Objective C). Затем вы можете использовать STL или любой другой код C ++.
Одна из проблем использования очереди / вектора / списка STL с объектами Objective C заключается в том, что они обычно не поддерживают управление сохранением / освобождением / автоматическим освобождением памяти. Это легко обойти с помощью класса контейнера C ++ Smart Pointer, который сохраняет свой объект Objective C при создании и освобождает его при уничтожении. В зависимости от того, что вы помещаете в очередь STL, в этом часто нет необходимости.
источник
Используйте NSMutableArray.
источник