crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Вычитание одного QStringList из другого.
RazrFalcon
  опции профиля:
сообщение 13.5.2011, 15:47
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Куда копать?

Имеется 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));
  }
}

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

Сообщение отредактировал RazrFalcon - 13.5.2011, 15:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.5.2011, 21:02
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

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

В подобных ситуациях, когда в контейнере нужно удалять элемент в цикле, лучше вместо удаления элементов создавать новый список и в цикле копировать в него данные, которые должны остаться. И этот новый список будет результатом работы (функции).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.5.2011, 21:35
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


О. Спасибо. Не подумал. У меня список большой, и вылетов еще не было. Но идею понял.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
novichkov
  опции профиля:
сообщение 22.5.2011, 10:17
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


А я всегда думал, что в таких случаях нужно использовать mutable iterators.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 23:30