私はいくつかのオブジェクトのpriority_queueを持っています:
typedef priority_queue<Object> Queue;
Queue queue;
ときどき、オブジェクトの 1 つの優先度が変わることがあります。効率的な方法でキュー内のそのオブジェクトの優先度を更新できる必要があります。現在、私はこの方法を使用していますが、これは機能しますが非効率的です:
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
当時はちょっと急いでいたので、この方法で実装しました。これが、問題なく動作することを確認できる最速の方法でした。ただし、これよりも良い方法があるはずです。本当に私が欲しいのは、次のいずれかの方法です。
- 優先度が変更されたインスタンスを抽出し、新しい優先度値を持つ新しいインスタンスを挿入します
- 変更された優先度でインスタンスを更新してから、正しくソートされるようにキューを更新します
これを行う最善の方法は何ですか?