Russian Qt Forum

Qt => Общие вопросы => Тема начата: izoomer от Январь 17, 2007, 18:38



Название: работа с QList<int>
Отправлено: izoomer от Январь 17, 2007, 18:38
посоветуйте как лучше реализовать:
есть QList<int> с неизвестным количеством элементов, требуется просмотреть весь лист и все значения уменьшить на 1, а если значение после этого стало 0 то удалить его из списка совсем.


Название: работа с QList<int>
Отправлено: Steven_Orko от Январь 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;
};


Название: работа с QList<int>
Отправлено: nova от Январь 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();
     }
 }


Название: работа с QList<int>
Отправлено: Steven_Orko от Январь 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, а не ждать следующего уменьшения все значений...


Название: работа с QList<int>
Отправлено: izoomer от Январь 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


Название: работа с QList<int>
Отправлено: nova от Январь 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();
  }


Название: работа с QList<int>
Отправлено: izoomer от Январь 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


Название: работа с QList<int>
Отправлено: nova от Январь 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();
  }


Название: работа с QList<int>
Отправлено: izoomer от Январь 17, 2007, 20:50
нет, не корректно уменьшает если в списке больше 1 значения


Название: работа с QList<int>
Отправлено: nova от Январь 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)


Название: работа с QList<int>
Отправлено: izoomer от Январь 17, 2007, 21:23
прошу прощения, нашел где два раза вызываю ... вечер - устал.
Спасибо всем за помощь  - оба варианта работают замечательно.


Название: работа с QList<int>
Отправлено: Dendy от Январь 17, 2007, 22:28
Чето у вас слишком много букв в коде. А как же Code Less. Create More?

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


Название: работа с QList<int>
Отправлено: nova от Январь 17, 2007, 22:31
Во усталость прошла, соображать стал :)
А я вот сижу туплю :(
Работы вагон а дубат лень  :roll:


Название: работа с QList<int>
Отправлено: izoomer от Январь 18, 2007, 00:16
Цитата: "Dendy"
Чето у вас слишком много букв в коде. А как же Code Less. Create More?

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


красиво ... есть чему поучиться ... спасибо