Ich habe eine priority_queue von irgendeinem Objekt:
typedef priority_queue<Object> Queue;
Queue queue;
Von Zeit zu Zeit kann sich die Priorität eines der Objekte ändern - ich muss in der Lage sein, die Priorität dieses Objekts in der Warteschlange auf effiziente Weise zu aktualisieren. Derzeit verwende ich diese Methode, die zwar funktioniert, aber ineffizient zu sein scheint:
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
Ich habe es auf diese Weise implementiert, weil ich es eilig hatte, und das war das Schnellste, was ich tun konnte, und ich konnte sicher sein, dass es funktionieren würde. Es muss ein besserer Weg als diese obwohl sein. Wirklich, was ich will, ist ein Weg, um entweder:
- die Instanz mit der geänderten Priorität herausnehmen und eine neue Instanz mit dem neuen Prioritätswert einfügen
- die Instanz mit der geänderten Priorität aktualisieren und dann die Warteschlange so aktualisieren, dass sie korrekt sortiert ist
Wie lässt sich dies am besten bewerkstelligen?