Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Вычитание одного QStringList из другого.

Автор: RazrFalcon 13.5.2011, 15:47

Куда копать?

Имеется 2-а QStringList. Из первого нужно вырезать все, что есть во втором. При том, что второй содержит только часть строки, которую нужно найти и вырезать в первом.

Если бы строки были одинаковые/полные. То ничего сложного:

# без учета повторов
for (int i = 0; i<list2->count(); ++i) {
    list1.removeOne(list2.at(i));
}


Пока что реализовал так:
for (int i = 0; i<list2.count(); ++i) {
  tempList = list1.filter(list2.at(i));
  for (int j = 0; j<tempList.count(); ++j) {
    list1.removeOne(tempList.at(j));
  }
}

Может есть более простой/правильный способ?

Автор: Litkevich Yuriy 13.5.2011, 21:02

Выбранный способ неправильный.

Ты сделал такую вещь:

i<list2.count();
это даёт тебе гарантию, что ты не выйдишь за пределы индекса списка.
Но. Когда цикл находится на индексе = 4 и происходит совпадение условия - удаляешь 1 элемент. Теперь кол-во элементов стало на 1-цу меньше, соответственно индексы сдвинулись, тот элемент что был 5-ым, стал четвёртым, однако цикл инкрементирует индекс и переходит к номеру 5, который раньше был номер 6.
Т.е. всякий раз, когда условие удаления выполнится, ты пропускаешь следующий элемент в списке.

В подобных ситуациях, когда в контейнере нужно удалять элемент в цикле, лучше вместо удаления элементов создавать новый список и в цикле копировать в него данные, которые должны остаться. И этот новый список будет результатом работы (функции).

Автор: RazrFalcon 13.5.2011, 21:35

О. Спасибо. Не подумал. У меня список большой, и вылетов еще не было. Но идею понял.

Автор: novichkov 22.5.2011, 10:17

А я всегда думал, что в таких случаях нужно использовать mutable iterators.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)