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

时间:2016-08-01 12:44:27

标签: c++ queue std stdvector

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

  

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

如何将队列强制转换为向量?

4 个答案:

答案 0 :(得分:7)

对于类似队列的行为和类似矢量的行为进行建模的正确容器是std::deque

这有以下优点:

  1. 在deque两端的常数时间插入和删除

  2. 在不破坏deque的情况下迭代元素的能力

  3. 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非转换。

答案 1 :(得分:5)

GetJSON有一个constructor taking a pair of iterators,所以如果您能够遍历队列,那么您将被设置。

借用this question的答案,您确实可以通过继承std::vector来实现这一点:

std::queue

(注意我们只允许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

答案 2 :(得分:4)

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

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()));

答案 3 :(得分:2)

这只是避免从std::queue复制的方法std::vector。如果要使用它,我会把它留给你。

处所

std::queue是容器适配器。默认情况下,内部containerstd::deque,但您也可以将其设置为std::vector。保存此容器的成员变量幸运地标记为protected。因此,您可以通过继承queue

来破解它

解决方案(!)

template<typename T>
struct my_queue : std::queue<T, std::vector<T>>
{
  using std::queue<T, std::vector<T>>::queue;
  // in G++, the variable name is `c`, but it may or may not differ
  std::vector<T>& to_vector () { return this->c; }
};

那就是它!!

用法

my_queue<int> q;
q.push(1);
q.push(2);
std::vector<int>& v = q.to_vector();

Demo

相关问题