crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Вычитание одного QStringList из другого.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
novichkov Дата 22.5.2011, 10:17
  А я всегда думал, что в таких случаях нужно использовать mutable iterators.
RazrFalcon Дата 13.5.2011, 21:35
  О. Спасибо. Не подумал. У меня список большой, и вылетов еще не было. Но идею понял.
Litkevich Yuriy Дата 13.5.2011, 21:02
  Выбранный способ неправильный.

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

В подобных ситуациях, когда в контейнере нужно удалять элемент в цикле, лучше вместо удаления элементов создавать новый список и в цикле копировать в него данные, которые должны остаться. И этот новый список будет результатом работы (функции).
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));
  }
}

Может есть более простой/правильный способ?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 21:09