Qt中的STL迭代器

STL iterator in Qt

本文关键字:迭代器 STL 中的 Qt      更新时间:2023-10-16

我想遍历一个列表并删除大于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时,或者如果大于30,但第一个元素也大于30 时,才会出现错误

与C++标准容器一样,erase在删除的元素之后返回一个迭代器,因此循环的一部分应该非常简单:

 if((*myiterator)>30)
    myiterator = mylist.erase( myiterator );
 else
    myiterator++;

删除元素时,迭代器前进了两次,修复方法如下:

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

*myiterator > 30

EDIT:实际上,QList::erase将迭代器返回到下一个元素。因此,这个代码应该做到:

myiterator = mylist.erase(myiterator);