2012-01-04 62 views
0

我想從std::list刪除一個元素,然後重新指向這個名單,但是當我做這種方式如何在擦除en元素後正確指向std :: list(double for循環)?

for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++) 
{ 
    for(std::list<CvRect>::iterator jt = listOfCvRects.begin(); jt != listOfCvRects.end(); jt++) 
    { 
     if(it == jt) 
     { continue;} 

     if((jt->x) > (it->x) //.. more conditions...) 
     { 
      jt = listOfCvRects.erase(jt); 
      //OR 
      //listOfCvRects.erase(jt++); 
     } 
    } 

} 

我和未處理的異常:iterator is unincrementable

+0

[可能重複(http://stackoverflow.com/q/596162/624900) – jterrace 2012-01-04 23:01:31

+0

如果條件是對稱的,你可以在啓動內環'jt = it;'。 – 2012-01-04 23:08:15

回答

4

我相信問題是,在在某些情況下(你刪除一個元素的情況),你需要雙倍遞增迭代器。您的循環如下所示:

for(std::list<T>::iterator jt = l.begin(); jt != l.end(); jt++) { 
    .... 
} 

但是這裏面你正在做這樣的事情:

jt = l.erase(jt); 

所以,如果情況發生,你做擦除,你刪除它,並在同時,將迭代器設置爲下一個元素......但是,您也可以使用jt++來遞增!

簡單的方法來固定,這是重新寫了for循環稍微適應這種形式的因素:

for(std::list<T>::iterator it = l.begin(); it != l.end();) { // notice no increment! 
    // ... 
    if(cond) { 
     it = l.erase(it); 
    } else { 
     ++it; 
    } 
} 

所以你在做一個或另一個增量,但不可能兼顧。

+0

那麼我能做些什麼來避免它呢? – Patryk 2012-01-04 23:06:11

+0

@Patryk:看到更新,我試圖在輸入完整答案時快速獲得基本知識:-)。 – 2012-01-04 23:07:42

0

從列表中清除元素會使指向該元素的迭代器失效,但不會指向其他迭代器。因此,你需要擦除之前做增量:

for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++) { 
    std::list<CvRect>::iterator jt = listOfCvRects.begin(); 
    while (jt != listOfCvRects.end()) { 
     if(it == jt) continue; 
     if((jt->x) > (it->x) //.. more conditions...) { 
      listOfCvRects.erase(jt++); 
     } else { 
      jt++; 
     } 
    } 
} 
+0

'erase'將迭代器返回到下一個元素(或'end()')。 – 2012-01-04 23:06:35