我可以使用迭代器访问优先级队列的元素吗?

时间:2013-08-28 16:03:18

标签: c++ c++11 priority-queue

向量和链接列表

矢量以串行方式存储在存储器中,因此可以使用operator[]访问任何元素,就像在数组中一样。

链表包含可能无法在内存中连续存储的元素,因此必须使用迭代器通过以下指针访问随机元素。

(你可能已经知道了。)

优先级问题的优势

最近我发现了'优先级队列',它有点像堆栈,但是元素是push() - 加到容器中,并且这个函数根据与{{{{}的比较将它们放在一个顺序中1}},我相信。

这非常适合我,因为我正在测试事件并根据它们发生的剩余时间将它们放入队列中。队列会自动为我排序operator<push()元素。 (弹出不影响顺序。)我可以写一个pop()所以这不是问题。

我无法解决的问题

我需要对此事件队列执行三项操作:

1 :)在事件队列中搜索项目。我假设这可以通过标准库中的算法来完成?例如,'找'?如果不是,我可以自己实施,只要我可以做第2点。(见下文)

2 :)迭代队列。我认为默认的底层容器是operator< ...有没有办法访问底层向量中的随机元素?如果我选择使用std::vector怎么办?我需要这样做来修改某些事件参数。 (事件放在队列中。)例如,我可能需要处理一个事件,然后从每个剩余事件的'time_to_event'参数中减去一个恒定的时间。我怀疑由于这个question而无法做到这一点。

3 :)从队列中删除一个元素。有时在处理事件时,其他事件会失效,因此需要删除。

可以完成1-3点吗?我在std::deque上的所有信息都来自cplusplus.com,所以我的默认答案是“不”,没有办法做任何这些事情。如果我不能做所有这三件事,那么我想我必须编写自己的优先级队列包装器。 (哦很无聊)

2 个答案:

答案 0 :(得分:9)

不,您无法迭代std::priority_queue中的项目。它支持的只是插入项目,并删除优先级最高的项目。

当您需要更多灵活性时,您可能希望使用std::make_heap将堆结构构建到容器中,std::push_heap来添加项目,std::pop_heap来删除项目。< / p>

由于这些是您应用于容器的算法,因此您仍然可以根据需要使用容器的迭代器。根据您在堆中修改数据的方式,您可能需要在之后重新构建堆 - 如果您以不再应用堆属性的方式对其进行修改。如果您有任何疑问,可以使用std::is_heap对其进行测试。

除此之外:我们中的许多人发现http://www.cppreference.com比您链接的网站更有用和准确。

答案 1 :(得分:1)

看看Boost.Heap。看起来它至少解决了两个问题(迭代和可变性)。