欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt java类型容器类的迭代

程序员文章站 2022-06-17 08:01:00
...

Qt中的两种迭代器类:

  • Java类型迭代器
  • STL 类型迭代器
    Java类型的迭代器分为只读操作迭代器和读写操作迭代器;迭代器的指针不是指向一个数据项,而是在数据项之间。
    例:
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<QString> list;
    list.append("A");
    list.append("B");
    list.append("C");
    list.append("D");
    QListIterator<QString> i(list);
    while (i.hasNext()) {
        qDebug()<<i.next();
    }

    return a.exec();
}

输出的结果为:

“A”
“B”
“C”
“D”

QList容器对象list作为参数传递给QListIterator迭代器i的构造函数,i用于list作只读遍历。起始时刻,迭代器指针在容器第一个数据项的前面,调用hasNext()判断迭代器指针后面是否还有数据项,如果有,就调用next()跳过一个数据项,并且next()函数返回跳过去的那个数据项。
也可以反向遍历:

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<QString> list;
    list.append("A");
    list.append("B");
    list.append("C");
    list.append("D");
    QListIterator<QString> i(list);
    i.toBack();
    while (i.hasPrevious()) {
        qDebug()<<i.previous();
    }

    return a.exec();
}

输出的结果为:

“D”
“C”
“B”
“A”

QListIterator用于移动指针和读取数据的函数有以下几种:

函数名称 功能
void toFront() 迭代器移动到列表的最前面,即第一个数据项之前
void toBack() 迭代器移动到列表的最后面,即最后一个数据项之后
boolhasNext() 如果迭代器不是位于列表的最后位置,返回true
const T & next() 返回下一个数据项,并且迭代器后移一个位置
const T & peekNext() 返回下一个数据项,但是不移动迭代器位置
bool hasPrevious() 如果迭代器不是位于列表的最前面,返回true
const T & previous() 返回前一个数据项,并且迭代器前移一个位置
const T & peekPrevious() 返回前一个数据项,但是不移动迭代器指针

QListIterator是只读访问容器内数据项的迭代器,若要在遍历过程中对容器中的数据项进行修改,需要使用QMutableListIterator:

    QList<int> list2;
    list2<<1<<2<<3<<4<<5;
    QMutableListIterator<int> i2(list2);
    while (i2.hasNext()) {
        if(i2.next() % 2 !=0)
            i2.remove();
        qDebug()<<i2.next();
    }

remove()函数移动next()函数刚刚跳过的一个数据项,不会使迭代器失效;
setValue()函数可以修改刚刚跳过去的数据项的值。
关联容器迭代器的使用
QMap<Key,T>可以使用QMapIterator和QMutableMapIterator迭代器类。相比于上表中的函数额外增加了key()和value()函数用于获取刚刚跳过的数据项的键和值。
例:

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString,QString> map;
    map.insert("Paris","France");
    map.insert("New York","USA");
    map.insert("Mexico City","USA");
    map.insert("Moscow","Russia");

    QMutableMapIterator<QString,QString> i(map);
    while (i.hasNext()) {
        if(i.next().key().endsWith("city"))
            i.remove();
        qDebug()<<i.key()<<":"<<i.value();
    }
    return a.exec();
}

程序的输出结果为:

“Mexico City” : “USA”
“Moscow” : “Russia”
“New York” : “USA”
“Paris” : “France”