如何在boost C ++中操作优先级队列中的元素

时间:2016-11-11 08:07:09

标签: c++ boost

我在处理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.

你可以看到我只能将优先级值推入队列,如果我想删除一个项目,我需要知道它的句柄值。但是,我不知道如何为大量项目提供句柄值。希望有人知道如何做到这一点。非常感谢!

1 个答案:

答案 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;
}