STL-итератор в Qt - PullRequest
       7

STL-итератор в Qt

0 голосов
/ 11 марта 2012

Я хочу просмотреть список и удалить элементы больше 30

QList<double> mylist;
QList<double>::iterator myiterator = mylist.begin();

mylist.append(6);
mylist.append(36);

myiterator=mylist.begin();
while(myiterator!=mylist.end())
{
    if(*(myiterator)>30)
    {
        QList<double>::iterator next=myiterator;
        next++;
        mylist.erase(myiterator);
        myiterator=next;

    }
    else
        myiterator++;

    if(myiterator==mylist.end())
        std::cout<<"end of list "<<std::endl;
    else
        std::cout<<" not end of list "<<std::endl;
}

. Вывод равен

 not end of list 
 not end of list 
The program has unexpectedly finished.
/home/maverik/Desktop/Qt/container_class/container_class exited with code 0

, где как будто я создаю mylist = {36,34} или mylist ={36,9} или mylist = {9,10}, тогда вывод равен

 not end of list 
end of list 

ошибка возникает только тогда, когда последний элемент больше 30 или больше, но 1-й элемент также больше 30

Ответы [ 2 ]

4 голосов
/ 11 марта 2012

Как и стандартные контейнеры C ++ erase возвращает итератор для элемента после удаленного, поэтому часть вашего цикла должна быть довольно простой:

 if((*myiterator)>30)
    myiterator = mylist.erase( myiterator );
 else
    myiterator++;
2 голосов
/ 11 марта 2012

Когда вы удаляете элемент, вы продвигаете свой итератор дважды, вот исправление:

QList<double>::iterator next=myiterator;
myiterator++;
mylist.erase(next);

Это должно быть сделано, когда *myiterator > 30

EDIT: фактически QList :: erase возвращает итератор для следующего элемента. Поэтому этот код должен это сделать:

myiterator = mylist.erase(myiterator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...