更改优先级队列元素会导致求助队列吗?

时间:2012-12-24 01:42:05

标签: c++ stl queue priority-queue

我有一个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

4 个答案:

答案 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 ++中的其他许多东西,你必须重新发明轮子,或找到为你重新创造它的时尚图书馆。

相关问题