0

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

要求:

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

一种选择是保留 apriority_queue并单独拥有 anunordered_set引用,但我宁愿不要有两个容器漂浮在周围。我也可以使用 adeque并搜索正确的插入位置,但如果可能的话,我宁愿让容器为我管理排序(并且恒定时间插入会比线性时间更好)。有什么建议么?

4

4 回答 4

3

有两种选择:

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

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

于 2013-06-06T22:10:38.057 回答
2

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

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

于 2013-06-06T22:13:24.047 回答
1

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

于 2013-06-06T22:18:24.957 回答
1

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

于 2013-06-06T22:09:52.533 回答