我有一个priority_queue,我想修改它的一些内容(优先级值),那么队列会被使用吗?
这取决于它是否按下推/弹(更可能,因为你只需要“插入”,而不是整体),或者访问顶部或弹出时。
我真的想要改变队列中的一些元素。这样的事情:
priority_queue<int> q;
int a=2,b=3,c=5;
int *ca=&a, *cb=&b, cc=&c;
q.push(a);
q.push(b);
q.push(c); //q is now {2,3,5}
*ca=4;
//what happens to q?
// 1) {3,4,5}
// 2) {4,2,5}
// 3) crash
答案 0 :(得分:4)
priority_queue
复制您推送到其中的值。最后的作业对优先级队列的顺序没有影响,也不会存储在其中的值。
答案 1 :(得分:3)
不幸的是,std::priority_queue
类不支持您正在寻找的increase/decrease_key
操作。当然,可以在要更新的堆中找到元素,然后调用make_heap
来恢复二进制堆不变量,但这不能像{{1}那样有效地完成。容器/算法。扫描堆以查找项目为std::
,然后O(N)
为make_heap
- 可以在O(N)
中为{2}进行increase/decrease_key
适当支持更新的堆。
Boost提供set of priority queue implementations,它可能比O(log(N))
(配对堆,Fibonacci堆等)更有效,并且还提供可变性,因此您可以有效地执行动态更新。所以全面使用增强容器可能是一个更好的选择。
答案 2 :(得分:2)
好的,经过搜索后我发现了如何&#34;度假&#34;队列,所以在每个优先级值更改后,您需要调用:
std::make_heap(const_cast<Type**>(&queue.top()),
const_cast<Type**>(&queue.top()) + queue.size(),
ComparerClass());
然后队列必须
std::priority_queue<Type*,vector<Type*>,ComparerClass> queue;
希望这有帮助。
答案 3 :(得分:2)
在考虑使用A *算法的优先级队列时,我偶然发现了这个问题。
基本上,C ++优先级队列是一个非常有限的玩具。
动态更改排队元素的优先级需要手动执行底层堆的完全重建,甚至不能保证在给定的STL实现上工作 和 是非常低效的 此外,重建堆需要对接丑陋的代码,这些代码必须隐藏在另一个混淆的类/模板中。
至于C ++中的其他许多东西,你必须重新发明轮子,或找到为你重新创造它的时尚图书馆。