STL 可迭代容器,例如 priority_queue

Posted

技术标签:

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

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

要求:

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

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

【问题讨论】:

快速说明——插入优先级队列需要记录时间,而不是恒定的。此外,它没有对队列进行排序。它只是将最少的元素保持在顶部。 很高兴知道。我想我对内部实现做了一些(错误的)假设。 【参考方案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) 了吗?它没有在队列内部排序,但具有您需要的优先级“从列表顶部弹出”。

【讨论】:

以上是关于STL 可迭代容器,例如 priority_queue的主要内容,如果未能解决你的问题,请参考以下文章

函数返回迭代器以构造 STL 容器

STL

使自定义容器可迭代

stl变易算法

STL源码剖析(迭代器)

STL概念