如何使用循环将向量推入 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&)
通过其内部的std::deque
实例将其参数复制到底层容器中。当参数超出范围时,这很好,q
拥有它自己的副本。
但请注意,
q.push(std::move(t));
会更有效,因为这只需要移动构造一个向量实例,这更便宜。这也是安全的,因为在将 t
移至队列后,您不再使用它。
【讨论】:
我相信在这里使用 queue::emplace 会更有益,因为不需要临时对象。所以不会发生复制/移动操作 @Rostin 你是对的。然而,可能是创建存储在队列中的向量比发布的内容更复杂。但无论如何,对于所示的示例,emplace_back
确实是一个更合适的选择。以上是关于如何使用循环将向量推入 queue<vector<int>>?的主要内容,如果未能解决你的问题,请参考以下文章