如何将 std::queue 转换为 std::vector

新手上路,请多包涵

我需要使用双打队列,因为它作为有序容器具有良好的属性。我想将此队列传递给接受向量的类构造函数。如果我直接这样做,我会收到以下错误:

候选构造函数不可行:第二个参数没有从 ‘std::queue’ 到 ‘std::vector &’ 的已知转换

如何将队列转换为向量?

原文由 Anthony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.4k
2 个回答

对 queue_like 行为和 vector-like 行为进行建模的正确容器是 std::deque

这具有以下优点:

  1. 在双端队列的任一端进行恒定时间插入和删除

  2. 在不破坏双端队列的情况下迭代元素的能力

std::deque 支持 begin()end() 方法,这意味着您可以直接构造一个向量(具有兼容的值类型)。

 #include <vector>
#include <deque>

class AcceptsVectors
{
public:
  AcceptsVectors(std::vector<double> arg);
};

int main()
{
    std::deque<double> myqueue;

    auto av = AcceptsVectors({myqueue.begin(), myqueue.end()});
}

不可能将 --- 非变异转换为 queue vector

原文由 Richard Hodges 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为没有任何直接的方法可用。因此,这可以通过将元素一一添加到向量来实现。

 std::vector<int> v;
while (!q.empty())
{
    v.push_back(q.front());
    q.pop();
}

请注意,此后队列将为空。

正如@David 在评论中所建议的那样,最好避免复制队列元素(特别是在包含的对象很大时很有帮助)。使用 emplace_back()std::move() 来实现相同的效果:

 v.emplace_back(std::move(q.front()));

原文由 CinCout 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题