我需要使用双精度队列,因为它具有作为有序容器的良好属性。我想将此队列传递给接受向量的类构造函数。如果我直接这样做,我会收到以下错误:
候选构造函数不可行:没有已知的转换 'std :: queue'到'std :: vector&'第二个参数
如何将队列强制转换为向量?
答案 0 :(得分:7)
对于类似队列的行为和类似矢量的行为进行建模的正确容器是std::deque
。
这有以下优点:
在deque两端的常数时间插入和删除
在不破坏deque的情况下迭代元素的能力
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
是容器适配器。默认情况下,内部container
为std::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();