STL可迭代容器,如priority_queue

时间:2013-06-06 22:02:02

标签: c++ stl containers priority-queue

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

要求:

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

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

4 个答案:

答案 0 :(得分:3)

有两种选择可以想到:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以将(ordered)设置为队列。 set.begin()将是你的顶级元素,你可以通过erase(set.begin())弹出它。

答案 3 :(得分:1)

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