Сохраняет ли QT QList итераторы после модификаций контейнера? - PullRequest
1 голос
/ 28 декабря 2011

Действительно ли итераторы, указывающие на элементы 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 ]

4 голосов
/ 28 декабря 2011

Если по какой-то причине вы хотите удалить элементы из контейнера таким образом, вы можете попробовать использовать 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: Классы контейнеров .

1 голос
/ 28 декабря 2011

Нет, итераторы не будут действительными. Если вы просто хотите удалить все элементы, используйте 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...