2011-12-28 158 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