我需要使用一个双重队列,因为它作为一个有序容器具有良好的属性。我想把这个队列传递给接受向量的类构造函数。如果我直接这样做,就会得到以下错误:
候选构造函数不可行:对于第二个参数,没有已知的从'std::queue‘到'std::vector &’的转换
如何将队列转换为向量?
发布于 2016-08-01 12:56:24
建模queue_like行为和类似向量行为的正确容器是一个std::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
。
发布于 2016-08-01 12:52:22
我不认为有任何直接的方法可用。因此,可以通过向向量逐个添加元素来实现这一点。
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()));
发布于 2016-08-01 12:52:39
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
#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;
}
https://stackoverflow.com/questions/38699268
复制相似问题