7

向量和链表

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

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

(你可能已经知道了。)

优先队列的优势

最近我发现了“优先队列”,它的工作原理有点像堆栈,但元素被-ed 放入容器中,我相信push(),这个函数根据与 的比较将它们按顺序排列。operator<

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

我无法解决的问题

我需要用这个事件队列做三件事:

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

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

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

1-3点能做到吗?我所掌握的所有信息std::priority_queue都来自cplusplus.com,所以我的默认答案是“否”,没有办法做任何这些事情。如果我不能同时做这三件事,那么我想我将不得不编写自己的优先级队列包装器。(哦无聊)

4

2 回答 2

10

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

当您想要更大的灵活性时,您可能希望使用std::make_heap将堆结构构建到容器中,std::push_heap添加项和std::pop_heap删除项。

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

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

于 2013-08-28T16:23:51.203 回答
1

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

于 2013-08-28T16:35:47.790 回答