【问题标题】:Can I access elements of a Priority Que using an iterator?我可以使用迭代器访问优先队列的元素吗?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,谢谢 Jerry,我想我最好开始编写自己的包装类。 (据我了解,这就是优先级队列的实现方式。
  • @EdwardBird 如果你这样做,堆管理算法可能会让你的生活轻松很多。请参阅标准库的 general algorithms 部分,特别注意堆操作。
  • @WhozCraig 是的,当然,再次实施它们没有意义吗?
【解决方案2】:

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

【讨论】:

  • 在这种情况下,可变性是什么意思?
  • @EdwardBird - 您可以更改项目的优先级。因此,要从列表中删除一个项目,您可以将其优先级更改为最大值,将其强制到队列的前面并将其弹出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多