LINUX.ORG.RU

Очередь с приоритетом

 


0

2

В продолжение предыдущей темы.

Нужна такая очередь. В неё добавляются события. Каждое событие содержит номер объекта, с которым оно связано, тип события (бинарный, один или ноль) и время. Из очереди необходимо извлечь событие с наименьшим временем. После каждого извлечения меняется время для нескольких событий в очереди, доступ производится по номеру объекта. Вопрос: какой тип очереди мне нужен (интересует класс из C++)?

★★★★★

Из очереди необходимо извлечь событие с наименьшим временем.

Вообще для приоритетной очереди юзают std::priority_queue.

После каждого извлечения меняется время для нескольких событий в очереди

А без изменения сделать слабо?

Pavval ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

std::priority_queue

Как с его помощью можно реализовать мою задачу? Насколько я понял, с помощью этого класса можно хранить только очередь из определённых значений (в моём случае моментов времени), но мне нужно, чтобы с этими моментами времени были ассоциированы ещё номер объекта и тип события, а также чтобы можно было изменять время по номеру объекта.

eugeno ★★★★★
() автор топика
Ответ на: комментарий от Pavval

А без изменения сделать слабо?

Это как? Моя задача требует, чтобы время переопределялось для нескольких событий.

eugeno ★★★★★
() автор топика
Ответ на: комментарий от AIv

Алгоритм переопределения времени какой?

  1. извлекается ближайшее событие;
  2. по номеру объекта, с которым оно связано, определяются номера объектов, для которых нужно изменить время;
  3. по номерам этих объектов изменяются времена событий в очереди.
eugeno ★★★★★
() автор топика
Последнее исправление: eugeno (всего исправлений: 1)
Ответ на: комментарий от Pavval

Если требует, то всё равно - priority_queue. Правда переопределение для многих может быть затратным.

Как же это реализовать? Разве я неправильно понял, что priority_queue хранит только по одному значению, а не пары ключ: значение?

eugeno ★★★★★
() автор топика
Ответ на: комментарий от eugeno

Как же это реализовать?

Смотри эта очередь является таким шаблоном

template<   class T, class Container = std::vector<T>,class Compare = std::less<typename Container::value_type>class priority_queue;
Ты можешь сделать свой Compare, он будет сортировать как тебя нужно. Я не сильно въежал в твои тонкости, возможно нужно будет сделать еще твой класс предикатным.

Boy_from_Jungle ★★★★
()
Последнее исправление: Boy_from_Jungle (всего исправлений: 1)
Ответ на: комментарий от eugeno

Элементами очереди м.б. структура с туевой хучей полей. Для этой структуры либо пишется свой компаратор, либо переопределяется операция сравнения (что ИМНО проще).

Но есть печалька... priority_queue не очень удобна будет, поскольку там не получится реализовать прозрачный доступ к зависимым событиям. Если только не химичить с операторами присваивания и аллокаторами элементов конечно... но все равно, в итоге придется ваять двусвязный граф, а это довольно муторно.

ИМНО лучше ручками взять какой нить контейнер, взять алгоритм сортировки и вперед. КОнкретика зависит от параметров задачи (как соотноситься число зависимых событий и общая длина очереди, может ли быть неск событий с одним и тем же временем и пр.).

AIv ★★★★★
()

Я думаю, что тебе сначала нужно прочитать буквари по С++.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.