Qt java类型容器类的迭代

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”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值