我在处理boost C ++中的配对优先级队列时遇到问题。我有一个项目数组{0,1,2,3,...},每个项目都有一个优先级值。这些优先级队列构造另一个数组{key0用于项0,key1用于项1,...}。
在算法中,我需要选择几个项目将它们放入优先级队列。例如,我可以将项目1,2,3选择为队列,按其优先级值(键)排序。然后,我需要删除一个特定的项目。例如,我可能想要从项目1,2,3的队列中删除项目2,而项目2可能没有最大/最小优先级值。
下面是我使用boost中的配对队列创建的队列。
#include "stdafx.h"
#include <iostream>
#include <boost/heap/pairing_heap.hpp>
pairing_heap<float> pq;
pq.push(1);
pq.push(2.5);
auto handle = pq.push(3.1);
pq.erase(handle); // remove an element by handle
cout << "pq top=" << pq.top() << endl; // a const_reference to the maximum element.
你可以看到我只能将优先级值推入队列,如果我想删除一个项目,我需要知道它的句柄值。但是,我不知道如何为大量项目提供句柄值。希望有人知道如何做到这一点。非常感谢!
答案 0 :(得分:0)
您可以使用s_handle_from_iterator
pq.update(Heap::s_handle_from_iterator(pq.begin()), pq.top()*2);
std::cout << "pq top=" << pq.top() << std::endl;
打印“5”。
我花了一些时间,但我发现docs说明操作是恒定时间(文档中指的是d_ary_heap
)。
<强> Live On Coliru 强>
#include <boost/heap/pairing_heap.hpp>
#include <iostream>
int main() {
using Heap = boost::heap::pairing_heap<float>;
Heap pq;
pq.push(1);
pq.push(2.5);
auto handle = pq.push(3.1);
pq.erase(handle); // remove an element by handle
std::cout << "pq top=" << pq.top() << std::endl; // a const_reference to the maximum element.
pq.update(Heap::s_handle_from_iterator(pq.begin()), pq.top()*2);
std::cout << "pq top=" << pq.top() << std::endl;
}