【问题标题】:STL iterable container like priority_queueSTL 可迭代容器,例如 priority_queue
【发布时间】:2013-06-06 22:02:02
【问题描述】:

我是 STL 容器(以及一般的 C++)的新手,所以我想向社区寻求帮助。我基本上想要一个支持不断迭代的priority_queue。现在,std::priority_queue 似乎不支持迭代,所以我将不得不使用其他东西,但我不确定具体是什么。

要求:

  • 维护插入顺序(如优先队列)
  • 从列表顶部弹出
  • 获取对列表中每个元素的 const 访问权限(此阶段无需关心队列中的顺序)

一种选择是保留一个priority_queue 并分别有一个unordered_set 的引用,但我宁愿不要有两个容器浮动。我也可以使用deque 并搜索正确的插入位置,但如果可能的话,我宁愿让容器为我管理排序(并且恒定时间插入会比线性时间更好)。有什么建议吗?

【问题讨论】:

  • 快速说明——插入优先级队列需要记录时间,而不是恒定的。此外,它没有对队列进行排序。它只是将最少的元素保持在顶部。
  • 很高兴知道。我想我对内部实现做了一些(错误的)假设。

标签: c++ stl containers priority-queue


【解决方案1】:

我想到了两个选项:

1) 使用std::vector 和堆操作算法实现您自己的可迭代优先级队列(请参阅堆操作 here)。

2) 从priority_queue 派生(私下)。这使您可以通过数据成员c 访问底层容器。然后,您可以在您的公共接口中公开迭代、随机访问和其他感兴趣的方法。

【讨论】:

  • 2) 我已经看到了这个建议,并且正在考虑它,但我对从现有容器派生持谨慎态度。不过,当然是一种选择。
  • @chessbot 我同意你的疑虑,但私有继承是相当安全的(虽然不是万无一失的)。
【解决方案2】:

正如其他人已经指出的那样,使用 std::vector 可能就足够了,但是如果您想要已经准备好的实现,也许可以使用 Boost.Heap(这是一个具有多个优先级队列容器的库):http://www.boost.org/doc/libs/1_53_0/doc/html/heap.html

Boost 是一个库集合,基本完成了标准库(其实并不大)。许多 C++ 开发人员已经在他们的开发计算机上准备好在需要时使用它。请谨慎选择库。

【讨论】:

  • 很好,不知道这些。我们已经在这个项目中使用了 Boost,所以我来看看。不过,我在让 Boost 容器为 TS-7800 编译时遇到了麻烦,所以如果失败了,我将不得不尝试不同的选项。
【解决方案3】:

您可以将(有序)集合用作队列。 set.begin() 将是您的顶级元素,您可以通过 erase(set.begin()) 弹出它。

【讨论】:

  • 这不是 OP 想要的。他们想要一个堆实现。 std::set 很可能没有实现为堆。
  • 我有 Java 背景,对 Set 进行排序的想法对我来说是错误的(我一直在寻找 SortedSet,但没有找到;猜想这就是为什么会有 unordered_set
  • @paddy OP 问题中没有出现“heap”一词,他希望优先级队列和集合支持所需的所有功能。
  • @paddy 是的,虽然我严格来说不需要,因为这可能不是大容量容器。
  • @chessbot c++ set(刚设置,来自标头)已排序,见:cplusplus.com/reference/set/set
【解决方案4】:

您观察到堆 (std::make_heap) 了吗?它没有在队列内部排序,但具有您需要的优先级“从列表顶部弹出”。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2011-05-27
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-01-15
    • 2014-09-10
    相关资源
    最近更新 更多