Я бы предложил сначала попробовать в лобовом режиме, чтобы обновить приоритет:
- удалить элемент из очереди
- вставьте его заново с новым приоритетом
В C ++ это можно сделать с помощью std::multi_map
, важно то, что объект должен помнить, где он хранится в структуре, чтобы иметь возможность эффективно удалять себя. Для повторной вставки это сложно, так как вы не можете предположить, что знаете что-либо о приоритетах.
class Item;
typedef std::multi_map<int, Item*> priority_queue;
class Item
{
public:
void add(priority_queue& queue);
void remove();
int getPriority() const;
void setPriority(int priority);
std::string& accessData();
const std::string& getData() const;
private:
int mPriority;
std::string mData;
priority_queue* mQueue;
priority_queue::iterator mIterator;
};
void Item::add(priority_queue& queue)
{
mQueue = &queue;
mIterator = queue.insert(std::make_pair(mPriority,this));
}
void Item::remove()
{
mQueue.erase(mIterator);
mQueue = 0;
mIterator = priority_queue::iterator();
}
void Item::setPriority(int priority)
{
mPriority = priority;
if (mQueue)
{
priority_queue& queue = *mQueue;
this->remove();
this->add(queue);
}
}