2013-10-10 23 views
0

目前,我有一個循環迭代通過一個向量,我試圖找到一個對象的索引,而我在循環中刪除它。我該如何解決這個問題?在循環中使用向量中的對象

這裏是我的代碼:

for (Object &a : objectDict) 
    { 
     a.setTime(theTime); 

     double tempMoveX = 0, tempMoveZ = 0, tempUX = 0,tempUZ = 0; 

     for (Object &b : objectDict) 
     { 
      if (a != b) 
      { 
       ... 
        debug << fixed << setprecision(20) << "Collision" << endl; 
        a.appendMass(b.getMass()); 

        objectDict.erase(find(objectDict.begin(), objectDict.end(), b)); 
       ... 

那是重要組成部分。如何從矢量中刪除對象b?

+0

你不需要兩個for循環,只需使用find/find_if然後擦除 – billz

+0

這兩個循環是因爲我在別處使用,我只是對刪除b感興趣。我試過find/find_if,但是我得到Object和const Object之間的無效操作數。 – DuskFall

+0

你想擦掉什麼樣的'b'? – billz

回答

0

好吧,如果你在迭代向量的元素,而不是需要一個指標:

for (Object &a : objectDict) { ... 

做傳統:

for (size_t i = 0; i < objectDict.size(); ++i) { ... 

和循環體內:而不是使用參考a,你將使用objectDict[i],那麼當你需要擦除元素時,你可以這樣做:

objectDict.erase(vec.begin() + i); 
i--; 

i--用於將索引向後移動1,以便當下一次迭代再次遞增時,緊跟已擦除元素後面的元素不會被跳過。

+0

這一個工作,但它沒有因此我使用了晦澀的方法。也許我寫錯了什麼... – DuskFall

1

一個簡單的方法是簡單地構建一個單獨的向量,其中包含稍後要擦除的元素索引。一旦你完成了正規向量的處理,通過「待移除」向量以相反的順序循環(反過來,因爲你不想使索引失效),並且擦除它們。

或者,當您迭代原始矢量時,選擇您想要的元素保留,並將它們複製到另一個矢量。最後,交換兩個向量(這很便宜)。如果您平均需要刪除相對較多的元素,這樣做會更好。

+0

你能告訴我該怎麼做嗎? – DuskFall

+1

您要求我在發佈解決方案大綱的兩分鐘內爲您編寫代碼。這意味着你沒有嘗試自己編寫代碼。嘗試。 –