首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将std::queue转换为std::vector

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

Stack Overflow用户
提问于 2016-08-01 12:44:26
回答 4查看 32.7K关注 0票数 20

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

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

如何将队列转换为向量?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-01 12:56:24

建模queue_like行为和类似向量行为的正确容器是一个std::deque

这样做的好处是:

  1. 固定时间的插入和删除的两端。
  2. 迭代元素而不破坏deque的能力

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

代码语言:javascript
运行
复制
#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

票数 22
EN

Stack Overflow用户

发布于 2016-08-01 12:52:22

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

代码语言:javascript
运行
复制
std::vector<int> v;
while (!q.empty())
{
    v.push_back(q.front());
    q.pop();
}

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

正如@David在注释中所建议的那样,最好避免复制队列元素(特别是当包含的对象很大时)。使用emplace_back()std::move()实现相同的目标:

代码语言:javascript
运行
复制
v.emplace_back(std::move(q.front()));
票数 10
EN

Stack Overflow用户

发布于 2016-08-01 12:52:39

std::vector有一个构造函数采用一对迭代器。,所以如果您能够在队列中迭代,那么您将被设置。

借用这个问题的答案,您确实可以通过子类std::queue来实现这一点。

代码语言:javascript
运行
复制
template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
    typedef typename Container::const_iterator const_iterator;

    const_iterator begin() const { return this->c.begin(); }                                                                               
    const_iterator end() const { return this->c.end(); }
};

(注意,我们只允许const迭代;出于这个问题的目的,我们不需要迭代器允许修改元素。)

这样,就可以很容易地构建一个vector

代码语言:javascript
运行
复制
#include <queue>
#include <vector>

using namespace std;

template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
    typedef typename Container::const_iterator const_iterator;

    const_iterator begin() const { return this->c.begin(); }                                                                               
    const_iterator end() const { return this->c.end(); }
};

int main() {
    iterable_queue<int> int_queue;
    for(int i=0; i<10; ++i)
        int_queue.push(i);

    vector<int> v(int_queue.begin(), int_queue.end());
    return 0;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38699268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档