QT';s QList在容器';什么是修改?

QT';s QList在容器';什么是修改?,qt,iterator,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' 因此,当删除容器包含多

在QList中执行任何删除操作后,指向QList元素的迭代器是否仍然有效? 我需要从QList中删除一些元素,所以我将这些元素的迭代器存储到另一个容器中,然后使用保存的迭代器从QList中删除必要的元素。 看起来是这样的:

// inside a loop for 'list'
QList<type>::iterator it = list.begin() + j;
removing.append(it);
// end of loop for 'list'
因此,当
删除
容器包含多个元素时,当尝试擦除第二个元素时,会发生应用程序崩溃(分段错误),而第一个元素被成功擦除。
原因是什么?是否有任何方法可以使用迭代器删除元素?

否,迭代器将无效。如果只想删除所有元素,请使用
QList::clear()
。如果需要删除项目,可以首先在
QList
上调用
qdeletall()

如果希望使用迭代器选择性地删除元素,可以执行以下操作。您可能需要修改它以进行内存管理

#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();
}
#包括
#包括
int main(int argc,字符**argv){
QCore应用程序应用程序(argc、argv);
QList项目;

items否,迭代器将无效。如果您只想删除所有元素,请使用
QList::clear()
。如果需要删除项目,可以先在
QList
上调用
qdeletall()

如果要使用迭代器有选择地删除元素,可以执行以下操作。可能需要修改它以进行内存管理

#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();
}
#包括
#包括
int main(int argc,字符**argv){
QCore应用程序应用程序(argc、argv);
QList项目;

items如果出于某种原因,您希望以这种方式从容器中删除元素,那么您可以尝试使用QLinkedList而不是QList,因为指向QLinkedList中某个项的迭代器在该项存在时保持有效,而指向QList的迭代器在任何插入或删除后都可能无效。
我复制了这个引用自Qt文档:。

如果出于某种原因,您希望以这种方式从容器中删除元素,那么您可以尝试使用QLinkedList而不是QList,因为指向QLinkedList中某个项的迭代器在该项存在时保持有效,而指向QList的迭代器在任何插入后都可能无效或者删除。
我从Qt的文档中复制了这段引用:。

谢谢你的回答!在我的例子中有一些困难,因为在定义不必要的项时,我必须通过双循环处理列表(我使用索引:for(I;;){for(j;;){}),所以当我删除列表中的项时,应该是其中一个索引将立即指向另一个元素。如果在QList的“type”中有任何已标识的字段,使用您的解决方案是相当方便的,但是…没关系,我将重建我的源代码:)。再次感谢您的关注!我不确定我是否理解您描述的困难,但j必须确保我们清楚:您可以在删除迭代器之前在迭代器上进行处理,并且在调用erase时迭代器自动指向下一项。我将更新代码以反映这一点。在我的算法(此处未显示)中,我执行两个步骤:1.定义不必要的元素(执行此操作时,源列表必须保持不变)删除定义的不必要元素。在您的示例中,可以使用单个循环进行处理,但我不能这样做(需要两次循环)。对不起,如果我不理解您的意见,请原谅。我的列表元素没有任何可以识别自己的信息-因此我决定使用迭代器。谢谢您的回答!在我的例子中,有一些困难,因为在定义不必要的项时,我必须通过双循环处理列表(我使用索引:for(I;;){for(j;;){}),所以当我删除列表中的项时,应该是其中一个索引将立即指向另一个元素。如果在QList的“type”中有任何已标识的字段,使用您的解决方案是相当方便的,但是…没关系,我将重建我的源代码:)。再次感谢您的关注!我不确定我是否理解您描述的困难,但j必须确保我们清楚:您可以在删除迭代器之前在迭代器上进行处理,并且在调用erase时迭代器自动指向下一项。我将更新代码以反映这一点。在我的算法(此处未显示)中,我执行两个步骤:1.定义不必要的元素(执行此操作时,源列表必须保持不变)删除定义的不必要元素。在您的示例中,可以使用单个循环进行处理,但我不能这样做(需要两次循环)。对不起,如果我不理解您的意见,请原谅。我的列表中的元素没有任何可以识别自己的信息-因此我决定使用迭代器。非常感谢!使用QLinkedList有助于正确工作!非常感谢!使用QLinkedList有助于正确工作!