2013-02-20 71 views
0

我的遊戲的主循環是這樣的:如何在不同的std :: vector中刪除相同的指針?

std::vector<std::unique_ptr<State>> states; 

for(size_t i = 0; i < states.size(); i++) 
{ 
    states[i]->Update(); 
    states[i]->Draw(); 

} 

他們與這雖然一大敗筆。迭代過程中我不能修改矢量(刪除狀態),因爲如果我刪除了當前狀態的迭代是那麼它顯然打破了,因爲沒有國家調用更新和借鑑。所以,我認爲這將是一個好主意,以應添加到states矢量狀態的載體,並應刪除的states矢量狀態的載體。然後在循環結束後修改向量,並且在迭代過程中不會出現任何問題。

std::vector<std::unique_ptr<State>> states; 
std::vector<std::unique_ptr<State>> statesToBeAdded; 
std::vector<std::unique_ptr<State>> statesToBeRemoved; 

for(size_t i = 0; i < states.size(); i++) 
{ 
    states[i]->Update(); 
    states[i]->Draw(); 

} 

for(size_t i = 0; i < statesToBeAdded.size(); i++) 
{ 
    states.push_back(std::move(statesToBeAdded[i])); 
} 
statesToBeAdded.clear(); 

for(size_t i = 0; i < statesToBeRemoved.size(); i++) 
{ 
    states.erase(std::remove(states.begin(), states.end(), statesToBeRemoved[i]), states.end()); 
} 
statesToBeRemoved.clear(); //error is thrown here 

我不能從states矢量刪除狀態,雖然,錯誤被扔在statesToBeRemoved.clear()行,我想這是因爲當我打電話的states.erase(...)線就從states載體,它因此勾銷了刪除元素statesToBeRemoved向量中的相同元素,因爲該元素指向不再存在的對象。

你不能只刪除一個std ::的unique_ptr不會破壞什麼指針指向,所以我不認爲有一種方式來刪除從states矢量元素,而不在statesToBeRemoved矢量抵消的元素。那麼如何解決這個問題呢?

謝謝。

+9

呃......它被稱爲**獨特的**指針。你不應該有兩個指向相同的東西,**有史以來**。確定你的所有權語義應該是什麼,並相應地改變你的指針類型。 – us2012 2013-02-20 23:49:20

+5

它看起來像'statesToBeAdded'和'statesToBeRemoved'應該只包含'州*'和'states'應該有'unique_ptr'實例(因爲所有權)。 – 2013-02-20 23:51:02

+0

顯示「State」的定義。最好的,展示一個完整的小程序來展示問題。 – 2013-02-21 00:03:23

回答

0

不同的指針類型滿足不同所有制的語義:

  • unique_ptr s爲獨特的所有權,這就是爲什麼當前的代碼不起作用
  • shared_ptr s爲共享所有權 - 當最後shared_ptr管理對象超出範圍,它被摧毀
  • 原始指針(*)真的不說的,他們正在建模的語義任何東西,但你必須手動執行所有的約束 - 這是什麼使他們危險。然而,他們是安全的,並且(在我看來,這是明智的選擇),指針永遠不會擁有指向對象的所有權。

因此:只要您能確保您從未在states中找到過任何東西,您的statesToBeAdded就是安全的。 statesToBeRemoved不同的是:對象是已經存在並在states,它將使意義有對象的states取得所有權 - 因此原始指針將是一個合理的選擇。statesToBeRemoved

注意,這一切都是基於你的顯示幾行代碼,根據不同的情況下,可能的情況是,它是有道理的存儲State!而非unique_ptr<State>在你states,等...

相關問題