LINUX.ORG.RU

распрекрасный Qt


0

0

непонятные эффекты:

есть список ot_record* rec и вот такая вот функция:

void ot_order::null_del() { printf("ot_order::null_del()\n"); QValueList<ot_record*>::Iterator i; for(i=rec.begin();i!=rec.end();i++) { printf("id=%i\trid=%i\n",(*i)->i_id,(*i)->i_rid); if((*i)->i_id==0){i=rec.remove(i);} } printf("ot_order::null_del() return\n"); }

она всего-лишь навсего удаляет из списка элементы помеченные i_id=0

вызываем (4 раза): if(f==0)null_del(); if(f==0)null_del(); if(f==0)null_del(); if(f==0)null_del();

получается следующая картина: ot_order::null_del() id=1 rid=0 id=0 rid=2 id=0 rid=2 id=0 rid=2 id=0 rid=2 id=0 rid=4 id=0 rid=10 id=0 rid=4 id=0 rid=14 id=0 rid=14 id=0 rid=14 id=1 rid=0 id=0 rid=2 id=0 rid=2 id=0 rid=10 id=0 rid=14 id=0 rid=14 id=1 rid=0 id=0 rid=2 id=0 rid=10 ot_order::null_del() return ot_order::null_del() id=1 rid=0 id=0 rid=1 ot_order::null_del() return ot_order::null_del() id=1 rid=0 id=0 rid=14 id=1 rid=0 ot_order::null_del() return ot_order::null_del() id=1 rid=0 ot_order::null_del() return ot_order::page_del() return

как это понимать ???

★★

Ответ на: комментарий от Reset

вот

непонятные эффекты:

есть список ot_record* rec и вот такая вот функция:

void ot_order::null_del() {
printf("ot_order::null_del()\n");
QValueList<ot_record*>::Iterator i;
for(i=rec.begin();i!=rec.end();i++) {
printf("id=%i\trid=%i\n",(*i)->i_id,(*i)->i_rid);
if((*i)->i_id==0){i=rec.remove(i);}
}
printf("ot_order::null_del() return\n");
}

она всего-лишь навсего удаляет из списка элементы помеченные i_id=0

вызываем (4 раза):
null_del();
null_del();
null_del();
null_del();

получается следующая картина:
ot_order::null_del()
id=1 rid=0
id=0 rid=2
id=0 rid=2
id=0 rid=2
id=0 rid=2
id=0 rid=4
id=0 rid=10
id=0 rid=4
id=0 rid=14
id=0 rid=14
id=0 rid=14
id=1 rid=0
id=0 rid=2
id=0 rid=2
id=0 rid=10
id=0 rid=14
id=0 rid=14
id=1 rid=0
id=0 rid=2
id=0 rid=10
ot_order::null_del() return
ot_order::null_del()
id=1 rid=0
id=0 rid=1
ot_order::null_del() return
ot_order::null_del()
id=1 rid=0
id=0 rid=14
id=1 rid=0
ot_order::null_del() return
ot_order::null_del()
id=1 rid=0
ot_order::null_del() return
ot_order::page_del() return

как это понимать ???

scaldov ★★
() автор топика
Ответ на: комментарий от scaldov

У тебя вообще непонятно что происходит, ты проходишь по контейнеру по итераторам и тут же удаляешь элементы. i=rec.remove(i); чего возвращает? следующий после удаленного? А потом еще ты делаешь ++i ...

В общем не трахай мозг и удаляй в два прохода. На первом проходе выбираешь то, что надо удалять в отдельный контейнер. На втором проходе идешь по этому отдельному контейнеру и удаляешь элементы из изначального. Тогда работать будет всегда на любых контейнерах и любых библиотеках.

Reset ★★★★★
()
Ответ на: комментарий от Reset

всё согласно документации. remove возвращает именно следующий элемент.
вообще-то это и есть второй проход удаления. попробую как ты говоришь. я тоже так хотел сделать сначала, но думал, что будет работать согласно документации, и 3 прохода - это слишком.

в самодельных списках и списках STL такого не было!

scaldov ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.