迭代并修改c ++优先级队列

时间:2014-03-13 03:43:52

标签: c++ boost priority-queue

我想要一个可以迭代和修改的优先级队列。换句话说,非常量迭代器。

好像是 std::priority_queue<T>不支持更改密钥值以保护结构损坏。

我发现boost::heap::prioity_queue支持 priority_queue 键的可变性/使用更新函数修改值以保持数据结构的不变性。

boost也支持迭代器,但它们是const迭代器,不允许更改。

1 个答案:

答案 0 :(得分:4)

该标准具有帮助维护堆的功能,make_heappush_heappop_heap。将那些与std::vector或其他随机访问容器组合在一起,维护一个可以迭代的堆的工作并不多。

示例:

std::vector<int> heap = {1,3,5,7,9};
std::make_heap(heap.begin(), heap.end());

// add an element
heap.push_back(4);
std::push_heap(heap.begin(), heap.end());

// remove an element
std::pop_heap(heap.begin(), heap.end());
heap.pop_back();

// multiply each element by 2
for (auto & i : heap)
    i *= 2;

Demo

另请注意,所有堆函数都有一个比较器的可选参数,以便您可以控制堆的顺序。