2014-10-31 161 views
2

我正在尋找最簡單的方法(算法?)將整個矢量推入隊列,然後刪除矢量。我認爲有幾種方法可以做到這一點,但我不確定哪個是最好的,或者它們是否都是正確的。選項1是使用vector.pop_back(),但我不得不通過for循環在這種情況下,這是不是因爲對象進入Vector中的隊列的順序並不重要把元素從矢量插入隊列,然後清除矢量

for(unsigned i = vector.size() - 1; i >= 0; i--){ 
    queue.push(vector[i]); 
    vector.pop_back(); 
} 
問題倒退

選項2是使用vector.erase()。也可以做我< vector.size()?因爲當我在網上找了通過矢量迭代我發現了很多我的!= vector.size(),而不是

for(unsigned i = 0; i < vector.size(); i++){ 
    queue.push(vector[i]); 
    vector.erase[i]; 
} 

我在這裏的問題是,如果我刪除向量[I],確實向量[I + 1]現在變成矢量[i]?或者矢量[i]變成空值?

我的第三個選項是隻刪除這一切在最後

for(unsigned i = 0; i < vector.size(); i++){ 
    queue.push(vector[i]); 
} 
vector.erase(vector.begin(), vector.end()); 

只是爲了清楚起見,我不想擺脫矢量變量本身,只是空,將其放入後隊列,因爲它最終會存儲一堆新事物,一次又一次地轉儲到隊列中。

+1

無符號值將始終是'> = 0',所以這是不行的。另外,如果矢量是空的,你將會有未定義的行爲。 while(!v.empty()){foo(v.back()); v.pop_back();}'。 – 2014-10-31 19:20:38

回答

2

如果你不介意隊列和向量中存在的對象一段時間,只需做最簡單的事情:第三種選擇,只需要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(); 
+0

'elem'會發生什麼?它會蒸發嗎? 'vector'不存在嗎?我有點困惑! – Ajay 2014-10-31 19:38:09

+1

@Ajay:它仍然在向量中,但是它的數據已經移走了(無用於'int')。它處於一個未指定的狀態(是的,模糊的)。然後被'std :: vector :: clear'操作立即銷燬。 – 2014-10-31 19:40:32

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]了?或者vector [i]變成了空值?「

擦除[i]根本不起作用,你可以從vector中逐個提取元素,但是可能會導致擦除(vector.begin())它不是非常有效的,整個循環應該因爲你刪除從向量頭O(N^2/2)結束。

C)

for(unsigned i = 0; i < vector.size(); i++){ 
     queue.push(vector[i]); 
    } 
    vector.clear(); 

應該是最有效的方式來走。

注意

一個一個你從尾部牽引要素,而從頭Ç把他們

+2

A是錯的。 '我'總是'> = 0'。 – 2014-10-31 19:58:38

0

除非結果元素類型很大,你不能做太多(除了@Angew建議的move)。如果元素尺寸很小,move也沒有任何好處 - vectorqueue的內存佈局都不相同。如果元素類型很大,您可以考慮使用元素的指針(在listvector中)。

0

如果你使用的是deque而不是queue,那麼你可以做一個insert並且一次插入所有的元素。

喜歡的東西

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