2016-06-10 75 views
0

我是C++的新手,所以我很難找出如何最好地從矢量中移除對象,同時仍然遍歷它。在迭代時從矢量中移除一個對象

基本上,我需要遍歷兩個向量。對於每個項目,如果ID匹配,我可以刪除它們。

//For every person, check to see if the available bags match: 
     for(std::vector<Person>::iterator pit = waitingPeopleVector.begin(); pit != waitingPeopleVector.end(); ++pit) { 
      for(std::vector<Bag>::iterator bit = waitingBagsVector.begin(); bit != waitingBagsVector.end(); ++bit) { 
       int pId = pit->getId(); 
       int bId = bit->getId(); 
       if(pId == bId){ 
        //a match occurs, remove the bag and person 
       } 
      } 
     } 

迭代器的工作是有點混亂,我知道我可以使用.erase()功能上我的載體,但我真的不能傳遞pitbit。任何幫助讚賞。謝謝

+0

'VECTOR'可能不是我們的最佳容器,因爲從載體移除元素是昂貴的,有點尷尬。 – melpomene

+0

相關:http://stackoverflow.com/questions/6096279/keeping-a-valid-vectoriterator-after-erase –

+0

另一個問題是你的方法是'O(n * n)'的複雜性。 100人,100袋,該循環進行10,000次迭代。是否有可能先排序id上的兩個向量? – PaulMcKenzie

回答

0

使用擦除刪除語言將實現此目標,下面提供了使用lambdas和<algorithm>函數(未經測試)的方法,用於從wPL中刪除與wBL具有相同ID的元素。將這個擴展到這兩個列表不應該太過努力。請注意,我們使用std::list而不是std::vector來加快刪除。

std::list<Person> wPL; 
std::list<Bag> wBL; 
//... 
wPL.erase(std::remove_if(wPL.begin(), wPL.end(), 
    [&wBL](auto x) { return std::find_if(wBL.begin(), wBL.end(), [](auto y) 
     { return x.getId() == y.getId();); }), wPL.end() }; 
+0

我懷疑一般情況下'std :: list'的移除速度要比'std :: vector'快。但是你可以肯定,如果你使用'std :: remove_if',它不會更快,因爲它仍然需要移動值。這就是爲什麼有'std :: list :: remove_if',它在節點上工作。 –

+0

@BenjaminLindley你說得很對,我猜上午2:20不是回答問題的時間 - 我會在明天編輯。 – ArchbishopOfBanterbury

+0

這隻會從'wPL'中刪除而不''wBL' –

1

從標準:

迭代器從a.erase返回(Q)點到元件 立即q之前的元件被擦除之後。如果不存在這樣的 元素,則返回a.end()。

我會用它像使用erase方法:

std::vector<Person>::iterator pit = waitingPeopleVector.begin(); 
std::vector<Bag>::iterator bit = waitingBagsVector.begin(); 

while (pit != waitingPeopleVector.end()) 
{ 
    bool didit; 

    while (bit != waitingBagsVector.end()) 
    { 
     didit = false; 
     if (pit->getId() == bit->getId() && !didit) 
     { 
      bit = waitingBagsVector.erase(bit); 
      pit = waitingPeopleVector.erase(pit); 
      didit = true; 
     } 
     else 
     { 
      ++bit; 
     } 
    } 

    if (didit) 
     continue; 
    else 
     ++pit; 
} 
+1

如果您得到一個匹配,可能會跳出內部循環。否則,你正在對'waitingPeopleVector.erase(pit)'返回的迭代器進行冗餘檢查。還要注意你的錯字,等待**包** Vector.erase(坑)應該等待**人** Vector.erase(坑) –

+0

正確!在代碼中修復... – Mendes