2010-10-10 104 views
11

可能重複:
Vector.erase(Iterator) causes bad memory access
iterate vector, remove certain items as I go.刪除在迭代

嗨, 我寫了這個,但我得到一些錯誤,運行它時,

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { 
     if (track->empty()) { // if track is empty, remove it 
      tracks_.erase(track); 
      track++; // is this ok? 
     }else { //if there are points, deque 
      track->erase(track->begin()); //my program crashes here after a while... ;(
     } 
    } 

我有矢量vecto我稱之爲曲目(1曲目是1個矢量點)的點數(2整數) 我想檢查每個曲目,如果它們包含點,則刪除第一個曲目,否則刪除曲目。它是否正確?

在此先感謝。

+0

你得到什麼錯誤? – 2010-10-10 17:39:42

+0

這類問題已經被多次提出。搜索「C++擦除迭代器」的第一個結果是http://stackoverflow.com/questions/2943912/vector-eraseiterator-causes-bad-memory-access它也回答了這個問題。 – TheUndeadFish 2010-10-10 17:41:45

+0

@ nacho4d:沒有直接關係,但請查看Boost MultiArray的二維結構。它比'std :: vector >'類型更容易使用。 – lunaryorn 2010-10-10 17:44:11

回答

33

向量的erase()使現有的迭代器無效,但它指向一個新的迭代器指向被刪除的元素之後的元素。這個返回的迭代器可以用來繼續遍歷向量。

你的循環可以這樣寫:

vector< vector<Point> >::iterator track = tracks_.begin(); 
while (track != tracks_.end()) { 
    if (track->empty()) { 
     // if track is empty, remove it 
     track = tracks_.erase(track); 
    } 
    else { 
     //if there are points, deque 
     track->erase(track->begin()); 
     ++track; 
    } 
} 
+0

太棒了。健壯,簡單,不需要自己製作代表等。 – Eliot 2013-05-09 21:27:04

+0

這是一種常見的模式,很高興看到類似的東西出現在std中。 – jbruni 2014-08-07 19:01:30

+0

第二個「deque」擦除是做什麼的?迭代器「軌道」甚至沒有擦除/開始方法?無法編譯它,並且運行良好。 – lama12345 2016-12-18 07:28:06