(Извините, я только видел этот вопрос.)
Природа кучи заключается в том, что она вообще не сохраняет порядок вставки, поэтому вам придется (1) построить очередь с приоритетамиповерх другой структуры данных или (2) дополнить кучу другой структурой данных, которая отслеживает порядок вставки.Однако куча, как правило, является наиболее эффективным (и предпочтительным) способом реализации очереди с приоритетами, поэтому я не знаю, стоит ли использовать что-то еще.Основная причина, по которой я говорю, заключается в том, что вы хотите, чтобы вставка была очень быстрой, что обеспечивает куча;добавление в отсортированный массив - нет.
Одна из возможностей - поддерживать очередь (например, CHCircularBufferQueue) для каждого уровня приоритета.(Я бы подумал, что вы захотите создать структуру-обертку, которая управляла бы очередями, чтобы вызывающим не приходилось иметь с ними дело напрямую.) Вы могли бы потенциально хранить очереди в словаре с ключом NSNumber, содержащим приоритет, но японятия не имею, как будет выглядеть представление.Это, очевидно, не очень эффективно масштабируется до чрезвычайно широкого диапазона приоритетов, и может быть не для большого количества вставок и удалений, но это может быть работоспособным в небольших случаях.Просто идея.
Другая идея - создать класс-обертку, который будет хранить как приоритет, так и время вставки, а затем сравнивать их по порядку.В этом случае вы, вероятно, захотите использовать отсортированный набор (например, двоичное дерево) для их хранения.Однако добавленные накладные расходы означают, что вы не получите ту же производительность, что и с кучей, но я полагаю, что это компромисс для поддержания порядка вставки.
Обновление: Я нашел следующие связанные вопросы:
https://stackoverflow.com/questions/tagged/priority-queue