【发布时间】:2013-08-29 00:35:47
【问题描述】:
向量和链表
向量以串行方式存储在内存中,因此可以使用operator[] 访问任何元素,就像在数组中一样。
链表包含的元素可能不会连续存储在内存中,因此必须使用迭代器通过以下指针访问随机元素。
(你可能已经知道了。)
优先队列的优势
最近我发现了“优先队列”,它的工作原理有点像堆栈,但元素被push()-ed 放入容器中,这个函数根据与operator< 的比较将它们按顺序排列,我相信。
这非常适合我,因为我正在测试事件并根据事件发生前的剩余时间将它们放入队列中。队列会自动为我将它们排序为 I push() 和 pop() 元素。 (弹出不影响顺序。)我可以写一个operator<,所以这不是问题。
我无法解决的问题
我需要用这个事件队列做三件事:
1:) 在事件队列中搜索一个项目。我假设这可以通过标准库中的算法来完成?例如,“找到”?如果不是,我可以自己实现一个,前提是我可以做到第 2 点。(见下文)
2:) 遍历队列。我认为默认的底层容器是std::vector... 有没有办法访问底层向量中的随机元素?如果我选择使用std::deque 会怎样?我需要这样做来修改某些事件参数。 (事件被放置在队列中。)例如,我可能需要处理一个事件,然后从每个剩余事件的“time_to_event”参数中减去一个恒定的时间量。我怀疑这是因为question 而无法完成。
3:) 从队列中移除一个元素。有时在处理事件时,其他事件会失效,因此需要移除。
第1-3点可以做吗?我在std::priority_queue 上的所有信息都来自cplusplus.com,所以我的默认答案是“否”,没有办法做任何这些事情。如果我不能同时做这三件事,那么我想我将不得不编写自己的优先级队列包装器。 (哦无聊)
【问题讨论】:
-
您似乎需要的所有操作通常都不适用于队列;该队列也是优先级队列没有区别。你将需要一个不同的算法,我可能会建议一个
std::map<>按由 (time-left, object id) 组成的两部分键排序,以建立严格的弱顺序。 -
我同意...插入、迭代和删除(中间元素)不是队列主体的一部分 :)
-
@WhozCraig 为什么要我使用
std::map? -
@EdwardBird 因为您可以完全按照您想要使用优先级队列的方式使用它。
mymap.begin()将是,如果像我描述的那样键入,你的队列的顶部。由于它是一张地图,您还可以根据需要任意枚举和删除(显然是搜索,尽管这有点奇怪)。最重要的是,您需要不同的容器类型来满足 1-3,我只是在折腾一个可能适合您的需求。 -
@WhozCraig 啊,对,我明白这不是我所需要的,但还是谢谢。
标签: c++ c++11 priority-queue