我希望将矢量的全部内容复制到C ++中的队列中。这是一个内置函数还是在每个元素上循环都是必要的?
答案 0 :(得分:14)
如果您创建新队列,则可以使用构造函数:
std::vector<int> v = get_vector();
std::queue<long int, std::deque<long int>> q(std::deque<long int>(v.begin(),
v.end()));
(您可以更改底层容器,但deque
可能是最好的。)
如果队列已经存在,那么没有基于范围的算法,你可以轻松编写自己的算法:
template <typename Iter, typename Q>
push_range(Q & q, Iter begin, Iter end)
{
for ( ; begin != end; ++begin)
q.push(*begin);
}
顺便说一句:如果您的算法需要大量的灵活性,那么您最好只使用std::deque
。容器适配器(queue
和stack
)只应在明确说明“这是我想要的行为”(即推/弹)时使用。
答案 1 :(得分:6)
可能最好的方法是直接将元素推入队列。
std::vector<T> v;
...
std::queue<T> q;
for (const auto& e: v)
q.push(e)
即使使用std :: copy也很繁琐,因为你必须将队列包装在适配器中(Insert into an STL queue using std::copy)。
答案 2 :(得分:2)
队列的构造函数如下:
explicit queue ( const Container& ctnr = Container() );
所以你可以有一些向量v并从中构造一个队列。
vector<int> v;
deque<int> d;
/* some random magic code goes here */
queue<int, deque<int>> q(d(v));
但是你不能对已经初始化的q中的push_back元素执行此操作。您可以使用另一个Container,清空您的队列,将您的向量追加到该容器,并从该向量创建一个新队列;但我会迭代而不是完成所有这些。
最终答案:不,没有为队列实现这样的方法,你可以使用deque或迭代你的向量。