在QList中有任何删除操作后,指向QList元素的迭代器是否仍然有效? 我需要从QList中删除一些元素,所以我将这些元素的迭代器存储到另一个容器中,然后使用这个保存的迭代器并使用从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个元素时,尝试擦除第二个元素时会发生应用程序崩溃(SEGMENTATION FAULT),而第一个元素成功擦除。
是什么原因,有没有办法用迭代器删除元素?
答案 0 :(得分:4)
如果由于某种原因你想以这种方式从容器中删除元素,那么你可以尝试使用QLinkedList而不是QList,因为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的文档中复制了这个引用:Container Classes。< / p>
答案 1 :(得分: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();
}