Мне нужно удалить некоторые элементы из 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 по индексам
Элементы удалялись без проблем
Комментариев нет:
Отправить комментарий