QT的QList是否在容器修改后保存迭代器?

时间:2011-12-28 14:40:56

标签: qt iterator

在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),而第一个元素成功擦除。 是什么原因,有没有办法用迭代器删除元素?

2 个答案:

答案 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();
}