将元素从矢量放入队列然后清除矢量

时间:2014-10-31 19:08:05

标签: c++ vector stl queue

我正在寻找最简单的方法(算法?)将整个矢量推送到队列然后删除矢量。我认为有几种方法可以做到这一点,但我不确定哪种方法最好,或者所有方法都是正确的。选项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());

为了清楚起见,我不想摆脱向量变量本身,只是在将它放入队列后将其清空,因为它最终将存储一堆新东西一次又一次地转储到队列中。

4 个答案:

答案 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也没有任何好处 - vectorqueue的内存布局都不同。如果element-type很大,您可以考虑使用指针(在listvector中)。

答案 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() );
    }
};