【问题标题】:Range based for-loop for priority_queuepriority_queue 的基于范围的 for 循环
【发布时间】:2014-12-06 06:44:44
【问题描述】:

像这样定义我的priority_queue,

priority_queue<int> parts(start, start+N, less<int>());

以下代码无法编译

for(int t : parts){
    ...
}

这让我产生疑问:

在 C++11 中,是否允许基于范围的 for 循环 std::priority_queue

一般来说,哪些结构可以使用基于范围的 for 循环进行迭代?

我知道我可以做几乎相同的事情:

while(!parts.empty()){
    cout << "Next element: " << parts.top() << endl;
    parts.pop();
}

仍然可以遍历队列吗?

【问题讨论】:

  • 不过,这不是一回事。 for 循环将遍历队列并使其保持原样(这通常不是优先级队列的用途),但 while 循环会将其清空。
  • @FredLarson +1 表示“这通常不是优先级队列的用途”;这正好回答了我的问题。

标签: c++ c++11 for-loop priority-queue


【解决方案1】:

不,std::priority_queue 不支持基于范围的 for 循环。

基于范围的 for 循环适用于数组和具有 begin()end() 成员函数的类。这包括 C++ 标准库中的所有容器以及std::string(及其basic_string 表亲),但不包括堆栈、队列或优先级队列,它们是容器适配器并且不要暴露迭代器。

【讨论】:

  • @pentix 不可移植,不。我可以建议使用std::set 吗?当然,它不是一个替代品,但它可以做优先级队列所能做的所有事情,并且具有相同的渐近复杂度(虽然常数因子往往更糟)
  • 我会关注std::set。我刚刚注意到我可以使用std::less&lt;int&gt;parts 写为std::vector&lt;int&gt;std::sort。但这对于std::set 似乎更适合的东西来说似乎需要大量计算。谢谢;)
  • @pentix:如果您想要 std::priority_queue 的行为和性能以及迭代的能力,您可以使用向量以及堆操作,make_heappush_heap 和 @ 987654323@。事实上,这正是std::priority_queue 的实现方式。
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 2014-01-12
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2023-03-05
相关资源
最近更新 更多