2011-12-28 71 views
1

在QList有任何刪除操作後,迭代器是否指向QList的元素仍然有效? 我需要從QList中刪除一些元素,所以我將這些元素的迭代器存儲到另一個容器中,然後使用此保存的迭代器並用於從QList中刪除必需的元素。 它看起來像這樣:QT的QList在容器修改後保存迭代器嗎?

// inside a loop for 'list' 
QList<type>::iterator it = list.begin() + j; 
removing.append(it); 
// end of loop for 'list' 

...

while(removing.empty() == false) 
{ 
    list.erase(removing.takeFirst()); 
} 

所以,當removing容器包含超過1元,應用程序崩潰時(分段錯誤)試圖刪除第二個元素,而首當被成功擦除。 是什麼原因,有什麼辦法用迭代器刪除元素?

回答

3

如果由於某種原因,你想在這樣一個容器刪除元素,那麼你可以嘗試,因爲我Iterators pointing to an item in a QLinkedList remain valid as long as the item exists, whereas iterators to a QList can become invalid after any insertion or removal.從複製Qt的文檔,這個報價,而不是使用的QList QLinkedList:Container Classes

+0

非常感謝!使用QLinkedList幫助和工作正確! – ASten 2011-12-28 16:56:31

1

不,迭代器將無效。如果您只想刪除所有元素,請使用QList::clear()。如果您需要刪除項目,您可以先致電qDeleteAll()QList

如果要使用迭代器有選擇地刪除元素,可以執行下列操作。您可能需要修改它以進行內存管理。

#include <QtCore> 
#include <QtDebug> 

int main(int argc, char **argv) { 
    QCoreApplication app(argc, argv); 

    QList<int> items; 
    items << 0 << 1 << 1 << 2 << 3 << 5 << 8 << 13 << 21 << 34 << 55 << 89 << 144; 

    QList<int>::iterator i = items.begin(); 
    while (i != items.end()) { 
    if ((*i) % 2 == 0) { 
     // i->DoSomething(); // Not with ints, obviously, but in general. 
     i = items.erase(i); // i points to the next item. 
    } else { 
     ++i; 
    } 
    } 

    qDebug() << items; 

    return app.exec(); 
} 
+0

感謝您的回答!在我的情況下有一些困難,因爲當定義不必要的項目時,我必須通過雙循環來處理列表(我使用索引:for(i ;;){for(j ;;){}}),所以當我刪除項目列表中,應該是其中一個索引將直接指向另一個元素。如果QList的「類型」中有任何已識別的字段,使用您的解決方案相當方便,但是......沒關係,我會重建我的源碼:)。再次感謝您的關注! – ASten 2011-12-28 16:14:51

+0

我不確定我是否理解你描述的難度,但只是爲了確保清楚:在刪除迭代器之前可以對其進行處理,並且在調用erase時迭代器會自動指向下一個項目。我將更新代碼以反映這一點。 – 2011-12-28 16:44:32

+0

在我的算法中(這裏沒有顯示),我做了2個步驟:1.定義不必要的元素(源列表必須保持未修改,而這樣做)和2.刪除定義的不必要的元素。在你的示例中,可以使用單個循環進行處理,但我無法做到這一點(需要兩次循環)。對不起,如果我不明白你的意見。 – ASten 2011-12-28 17:03:15