Страницы

Поиск по вопросам

среда, 20 марта 2019 г.

Сохраняются ли итераторы на элементы QList'а при его (QList'а) модификации?

Мне нужно удалить некоторые элементы из QList. Для ненужных элементов я создаю итераторы и помещаю их в отдельный контейнер removing // цикл для 'list' QList::iterator it = list.begin() + j; removing.append(it); // конец цикла для 'list' ... while(removing.empty() == false) { list.erase(removing.takeFirst()); } В результате получается, когда в контейнере removing больше одного элемента, то первый элемент удаляется нормально, а на удалении второго возникает SEGMENTATION FAULT. При этом в отладчике QtCreator'а я вижу, что адреса в списке list не изменяются даже после удаления из середины list'а. UPD Оказалось, для QList'а не гарантируется корректность итераторов при модификации контейнера: Краткое описание QLinkedList : (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.) . Решил путём замены QList на QLinkedList. Правда, это вызывало несколько неудобств - в частности, пришлось переходить на итераторы для обхода списка, но зато работает.


Ответ

При удалении элементов как-то делал так:
Проходил по списку1 и собирал индексы в список2 Проходил по списку2 с последнего элемента по первый (реверсированный список) и удалял из списка1 по индексам Элементы удалялись без проблем

Комментариев нет:

Отправить комментарий