我想要一个可以迭代和修改的优先级队列。换句话说,非常量迭代器。
好像是std::priority_queue<T>
不支持更改密钥值以保护结构损坏。
我发现boost::heap::prioity_queue
支持 priority_queue 键的可变性/使用更新函数修改值以保持数据结构的不变性。
boost也支持迭代器,但它们是const迭代器,不允许更改。
答案 0 :(得分:4)
该标准具有帮助维护堆的功能,make_heap
,push_heap
和pop_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;
另请注意,所有堆函数都有一个比较器的可选参数,以便您可以控制堆的顺序。