У меня есть priority_queue некоторого объекта:Как сделать эффективное обновление приоритета в STL priority_queue?
typedef priority_queue<Object> Queue;
Queue queue;
Время от времени, приоритет одного из объектов может измениться - мне нужно, чтобы иметь возможность обновить приоритет этого объекта в очереди в эффективной путь. В настоящее время я использую этот метод, который работает, но кажется неэффективным:
Queue newQueue;
while (!queue.empty())
{
Object obj=queue.top();
queue.pop();
if (priorityHasChanged(obj))
newQueue.push_back(Object(new_priority));
else
newQueue.push_back(obj);
}
newQueue.swap(queue); // this only works because I actually subclassed the priority_queue
// class and exposed a swap method that swaps in the container
Я реализовал это так, потому что я был в виде торопился в то время, и это было самым быстрым, что я мог сделать, чтобы я мог быть уверен, что будет работать нормально. Однако должен быть лучший способ, чем это сделать. На самом деле то, что я хочу это способ либо:
- извлечь из экземпляра с измененным приоритетом и вставить новый с новым значением приоритета
- обновления экземпляра с измененным приоритетом, а затем обновить очередь таким образом, что он правильно отсортирован
Каков наилучший способ для этого?
Неправильно - стандартная очередь приоритетов хранит контейнер в качестве защищенного члена 'c' (см. [Reference] (http://en.cppreference.com/w/cpp/container/priority_queue)). Вы можете получить из очереди приоритетов и получить доступ к контейнеру в производном классе. – 2013-08-28 07:37:14
@ user283145 уверен, что вы можете получить доступ к основной куче с 'c', но поскольку вы не можете найти индекс ключа в O (logn), вы не можете сделать обновление приоритета в O (lgn), которое действительно несчастная часть. –