如何使用循环将向量推入 queue<vector<int>>?

Posted

技术标签:

【中文标题】如何使用循环将向量推入 queue<vector<int>>?【英文标题】:How to push vectors into queue<vector<int>> using loop? 【发布时间】:2019-06-20 13:36:46 【问题描述】:

我想使用以下代码将向量推送到我的队列中:

queue<vector<int>> q;

for(int i=0;i<10;i++) 
    vector<int> t(3,-1);
    q.push(t);


vector<int> p = q.front();
q.pop();

这是正确的吗?我担心因为 t 仅在循环内定义,所以循环结束后它会被销毁。那么循环结束后,推送的向量还会存在队列中吗?

我有一个类似的代码给出了分段错误,所以我认为这可能是问题所在。

【问题讨论】:

假设您将整数而不是向量推送到队列中。你现在担心吗?为什么或为什么不? 【参考方案1】:

正如@lubgr 在他的回答中提到的那样,这是正确的, 使用std::queue::push时,容器将拥有参数的副本

使用std::queue::emplace 更高效,因为它将新元素推送到容器中,因此不会创建临时元素,也不会发生复制/移动操作

您使用 C++14 标准标记了这个问题,std::queue::emplace 自 C++11 起可用

https://en.cppreference.com/w/cpp/container/queue/emplace

【讨论】:

【参考方案2】:

这是正确的吗?

是的。当与默认的std::deque 后端一起使用时,std::queue::push(const T&amp;) 通过其内部的std::deque 实例将其参数复制到底层容器中。当参数超出范围时,这很好,q 拥有它自己的副本。

但请注意,

q.push(std::move(t));

会更有效,因为这只需要移动构造一个向量实例,这更便宜。这也是安全的,因为在将 t 移至队列后,您不再使用它。

【讨论】:

我相信在这里使用 queue::emplace 会更有益,因为不需要临时对象。所以不会发生复制/移动操作 @Rostin 你是对的。然而,可能是创建存储在队列中的向量比发布的内容更复杂。但无论如何,对于所示的示例,emplace_back 确实是一个更合适的选择。

以上是关于如何使用循环将向量推入 queue<vector<int>>?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串(逐个字符)推入字符串向量

将结构向量推入结构?

如何将向量传递给函数参数(我需要指针吗?)

将 1D 向量作为行推入 2D 向量数组

如何将字符串的字符推入二维向量[关闭]

如何在函数中访问向量的不同成员