2016-11-23 88 views
0

結束我已在相同類型的兩個矢量,如下所示:如何將一個向量的第一元素移動到另一個

std::vector<Task*> ToRun; 
std::vector<Task*> Completed; 

Task完成時,它需要被自動從移動ToRun將容器載入Completed載體。

託倫向量包含TaskOne TaskTwo TaskThree ... TaskN

完成向量包含nothing

通過ToRun向量第一環路之後,兩種載體應該如下:

託倫載體含有TaskTwo TaskThree ... TaskN

完整載體包含TaskOne

通過ToRun向量執行第二循環應該如下:

託倫載體包含TaskThree ... TaskN

完整載體包含TaskOne TaskTwo

我有下面的代碼,但我接收艾爾文以下錯誤:

Vector Moving Error

代碼片段:

​​

我試圖尋找thisthis SO回答不過我有沒有運氣。從發生的事情來看,我認爲迭代器在移動front元素之後指向null。

我應該嘗試將任務從一個容器移到另一個容器,然後是remove而不是擦除?

+0

爲什麼「擦除」?也就是說,用於其他**的「ToRun」是什麼? –

+0

@ Cheersandhth.-Alf'ToRun'只是執行特定任務的向量。任務的數量取決於配置文件,因此可能會有很多或者一些。我對STL容器和迭代器非常缺乏經驗,所以我一直在探索我的選項 – Sean

+0

那麼沒有必要一次一個「擦除」每個項目(這是您按照順序執行的二次時間)。最後只需清除矢量。或者什麼都不做。 –

回答

1

擦除而迭代總是凌亂的C++標準的描述。如果您擦除當前元素,++如何工作?

而是嘗試

while (!ToRun.empty()) // loop until empty 
{ 
    ToRun.front()->dump(os); 

    Completed.push_back(std::move(ToRun.front())); 
    ToRun.erase(ToRun.begin()); 
} 

或類似

但是,當你停下來想想這事總額。每個erase都會將ToRun中的其餘元素移回一個插槽,並添加大量不必要的迭代和複製。

for (auto & run: ToRun) // or old school iterator if you prefer 
{ 
    run->dump(os); 
    Completed.push_back(std::move(ToRun.front())); 
} 
toRun.clear(); 

clear執行只有一次,抹殺了整個容器的一個鏡頭。更乾淨。只需要一次迭代來確保析構函數被調用,並且不會銷燬指針。贏了!

將具有相同的效果(假設這不是多線程,並且如果它有嚴重的併發問題)。

Cheersandhth.-Alf還提出,由於ToRun似乎包含指針,std::move是沒有必要的。所有正在移動的東西都是一個指針,而這只是一個小小的努力。

+0

這就是我一直在尋找的!循環結構,但不必擔心迭代器。 – Sean

+0

關於效率,'move'對原始指針沒有影響,而這裏的算法是O(n^2)。 –

+1

@ Cheersandhth.-Alf它很粗糙。我認爲編輯是有序的。謝謝。 – user4581301

1

這種說法

ToRun.erase(ToRun.begin()); 

迭代iter後無效。

從方法erase

3 Effects: Invalidates iterators and references at or after the point of the erase.

相關問題