Russian Qt Forum
Ноябрь 24, 2024, 07:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с QList<int>  (Прочитано 10362 раз)
izoomer
Гость
« : Январь 17, 2007, 18:38 »

посоветуйте как лучше реализовать:
есть QList<int> с неизвестным количеством элементов, требуется просмотреть весь лист и все значения уменьшить на 1, а если значение после этого стало 0 то удалить его из списка совсем.
Записан
Steven_Orko
Гость
« Ответ #1 : Январь 17, 2007, 19:53 »

Я бы сделал так:
Код:

QList<int> mylist;

QList<int>::iterator cur = mylist.begin();
QList<int>::iterator last = mylist.end();
while ( cur != last)
{
*cur = *cur - 1;
    if (*cur <= 0)
{
        cur = mylist.erase(cur);
last = mylist.end();
}
else ++cur;
};
Записан
nova
Гость
« Ответ #2 : Январь 17, 2007, 19:55 »

Пример из доки по Qt:
Код:

 QMutableListIterator<int> i(list);
 while (i.hasNext()) {
     int val = i.next();
     if (val < 0) {
         i.setValue(-val);
     } else if (val == 0) {
         i.remove();
     }
 }
Записан
Steven_Orko
Гость
« Ответ #3 : Январь 17, 2007, 20:03 »

Цитата: "nova"
Пример из доки по Qt:


Тогда уж так:
Код:

 QMutableListIterator<int> i(list);
 while (i.hasNext())
 {
     int val = i.next();
     if (val != 0) i.setValue(--val);
     else i.remove();
 }


Только, судя по вопросу, удалить надо сразу же, как стало 0, а не ждать следующего уменьшения все значений...
Записан
izoomer
Гость
« Ответ #4 : Январь 17, 2007, 20:18 »

Цитировать

Код:

 QMutableListIterator<int> i(list);
 while (i.hasNext())
 {
     int val = i.next();
     if (val != 0) i.setValue(--val);
     else i.remove();
 }


Только, судя по вопросу, удалить надо сразу же, как стало 0, а не ждать следующего уменьшения все значений...


и как в этом случае сделать что бы сразу удалялось как только стало 0 ?

добавлено спустя 7 минут:

 
Цитата: "Steven_Orko"
Я бы сделал так:
Код:

QList<int> mylist;

QList<int>::iterator cur = mylist.begin();
QList<int>::iterator last = mylist.end();
while ( cur != last)
{
*cur = *cur - 1;
    if (*cur <= 0)
{
        cur = mylist.erase(cur);
last = mylist.end();
}
else ++cur;
};


 в этом случае работает корректно если в списке одно значение , если в списке два значения то уже не корректно уменьшает и удаляет

добавлено спустя 2 минуты:

 если точно то если в списке два значения - например -4,7 то при уменьшении становится не 3,6  а  2,5
Записан
nova
Гость
« Ответ #5 : Январь 17, 2007, 20:30 »

Цитата: "izoomer"
Цитировать

Код:

 QMutableListIterator<int> i(list);
 while (i.hasNext())
 {
     int val = i.next();
     if (val != 0) i.setValue(--val);
     else i.remove();
 }


Только, судя по вопросу, удалить надо сразу же, как стало 0, а не ждать следующего уменьшения все значений...


и как в этом случае сделать что бы сразу удалялось как только стало 0 ?
val-=1; втавить перед ифом
и в сет валуе убрать два минуса

А я вобщето пример из доки просто скопировал не переделывая Улыбающийся

добавлено спустя:

 Так стоп !
Тебе надо уменьшать значение в списке?
или только проверка и удаление если стало 0?

если второе то воттак:
Код:

QMutableListIterator<int> i(list);
  while (i.hasNext())
  {
      int val = i.next();
      if (--val == 0) i.remove();
  }
Записан
izoomer
Гость
« Ответ #6 : Январь 17, 2007, 20:32 »

Цитата: "nova"
Цитата: "izoomer"
Цитировать

Код:

 QMutableListIterator<int> i(list);
 while (i.hasNext())
 {
     int val = i.next();
     if (val != 0) i.setValue(--val);
     else i.remove();
 }


Только, судя по вопросу, удалить надо сразу же, как стало 0, а не ждать следующего уменьшения все значений...


и как в этом случае сделать что бы сразу удалялось как только стало 0 ?
val-=1; втавить перед ифом
и в сет валуе убрать два минуса

А я вобщето пример из доки просто скопировал не переделывая Улыбающийся

добавлено спустя:

 Так стоп !
Тебе надо уменьшать значение в списке?
или только проверка и удаление если стало 0?

если второе то воттак:
Код:

QMutableListIterator<int> i(list);
  while (i.hasNext())
  {
      int val = i.next();
      if (val == 0) i.remove();
  }

пройтись по всему списку и уменьшить все значения на 1 - и сразу же удалить элемент из списка если он стал ==0
в исправленом примере та же ситуация - если одно значение то все ок, если два и более то уменьшает на 2
Записан
nova
Гость
« Ответ #7 : Январь 17, 2007, 20:42 »

Вот:
Код:

QMutableListIterator<int> i(list);
  while (i.hasNext())
  {
      int val = i.next();
      val-=1;
      if (val != 0) i.setValue(val);
      else i.remove();
  }
Записан
izoomer
Гость
« Ответ #8 : Январь 17, 2007, 20:50 »

нет, не корректно уменьшает если в списке больше 1 значения
Записан
nova
Гость
« Ответ #9 : Январь 17, 2007, 21:04 »

ищи где ты енто место ДВА раза вызываеш Улыбающийся
не поленился проверить Подмигивающий
Код:

#include <Qt>
#include <QDebug>

int main(int argc, char *argv[])
{
  QList<int> list;
  list << 2 << 3 << 4 << 5 << 6;
  while(list.count())
  {
    qDebug() << list;
    QMutableListIterator<int> i(list);
    while (i.hasNext())
    {
      int val = i.next();
      val-=1;
      if (val != 0) i.setValue(val);
      else i.remove();
    }
  }
  return 0;
}

результат выполнения:
Код:

$ ./test12
(2, 3, 4, 5, 6)
(1, 2, 3, 4, 5)
(1, 2, 3, 4)
(1, 2, 3)
(1, 2)
(1)
Записан
izoomer
Гость
« Ответ #10 : Январь 17, 2007, 21:23 »

прошу прощения, нашел где два раза вызываю ... вечер - устал.
Спасибо всем за помощь  - оба варианта работают замечательно.
Записан
Dendy
Гость
« Ответ #11 : Январь 17, 2007, 22:28 »

Чето у вас слишком много букв в коде. А как же Code Less. Create More?

Код:
for ( QMutableListIterator<int> it( list ); it.hasNext(); )
  if ( --it.next() == 0 )
    it.remove();
Записан
nova
Гость
« Ответ #12 : Январь 17, 2007, 22:31 »

Во усталость прошла, соображать стал Улыбающийся
А я вот сижу туплю Грустный
Работы вагон а дубат лень  :roll:
Записан
izoomer
Гость
« Ответ #13 : Январь 18, 2007, 00:16 »

Цитата: "Dendy"
Чето у вас слишком много букв в коде. А как же Code Less. Create More?

Код:
for ( QMutableListIterator<int> it( list ); it.hasNext(); )
  if ( --it.next() == 0 )
    it.remove();


красиво ... есть чему поучиться ... спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 21.