我正在寻找最简单的方法(算法?)将整个矢量推送到队列然后删除矢量。我认为有几种方法可以做到这一点,但我不确定哪种方法最好,或者所有方法都是正确的。选项1是使用vector.pop_back()
,但在这种情况下我必须向后遍历for
循环,这不是问题,因为对象从向量进入队列的顺序无所谓
for(unsigned i = vector.size() - 1; i >= 0; i--){
queue.push(vector[i]);
vector.pop_back();
}
选项2是使用vector.erase()。也可以做我< vector.size()?因为当我在网上寻找迭代矢量时,我发现了很多i!= vector.size()而不是
for(unsigned i = 0; i < vector.size(); i++){
queue.push(vector[i]);
vector.erase[i];
}
我的问题是,如果我擦除向量[i],向量[i + 1]现在变为向量[i]吗?或者vector [i]是否为空值?
我的第三个选择就是在最后删除所有内容
for(unsigned i = 0; i < vector.size(); i++){
queue.push(vector[i]);
}
vector.erase(vector.begin(), vector.end());
为了清楚起见,我不想摆脱向量变量本身,只是在将它放入队列后将其清空,因为它最终将存储一堆新东西一次又一次地转储到队列中。
答案 0 :(得分:3)
如果你不介意队列和矢量中存在一段时间的对象,那么就做最简单的事情:你的第三个选项,只需要clear()
而不是明确你是什么这样做的:
for(size_t i = 0; i < vector.size(); i++){
queue.push(vector[i]);
}
vector.clear();
当然,在C ++ 11中,您可以使用基于范围的for
循环,甚至可以将项目移出向量以避免不必要的副本:
for (auto &elem : vector) {
queue.push(std::move(elem));
}
vector.clear();
答案 1 :(得分:0)
<强> A)强>
for(unsigned i = vector.size() - 1; i >= 0; i--){
queue.push(vector[i]);
vector.pop_back();
}
这应该比 C)
效率低一点<强> B)强>
for(unsigned i = 0; i < vector.size(); i++){
queue.push(vector[i]);
vector.erase[i];
}
“我的问题是,如果我擦除向量[i],向量[i + 1]现在变为向量[i]吗?还是向量[i]变为空值?”
擦除[i]根本不起作用。你可以逐个擦除(vector.begin())从矢量头中拉出元素,但它不是很有效,整个循环应该以O(N ^ 2/2)结束,因为你从矢量头删除。
C)
for(unsigned i = 0; i < vector.size(); i++){
queue.push(vector[i]);
}
vector.clear();
应该是最有效的方式。
注意强>
A 和 B 的结果,因为在 A 中你从尾部拉出元素从< > C 强>
答案 2 :(得分:0)
除非元素类型很大,否则你做不了多少(@Angew建议的move
除外)。如果元素大小很小,那么move
也没有任何好处 - vector
和queue
的内存布局都不同。如果element-type很大,您可以考虑使用指针(在list
或vector
中)。
答案 3 :(得分:0)
如果您使用deque而不是队列,那么您可以执行插入并立即插入所有元素。
像
这样的东西template <class T, template <typename, typename> class Container>
class BlockQueue : public Container<T, std::allocator<T>>
{
public:
BlockQueue() : Container<T, std::allocator<T>>()
{
}
void push( T val )
{
this->push_back( val );
}
void push( const std::vector<T>& newData )
{
this->insert( this->end(), newData.begin(), newData.end() );
}
};