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(刚设置,来自标头您观察到堆 (std::make_heap) 了吗?它没有在队列内部排序,但具有您需要的优先级“从列表顶部弹出”。
【讨论】:
以上是关于STL 可迭代容器,例如 priority_queue的主要内容,如果未能解决你的问题,请参考以下文章