迭代器(Iterator)

Qt的容器類提供了兩種風格的迭代器:Java 風格和STL 風格,QLinkedList、QVector和QSet的迭代器介面與QList一樣;QHash迭代器的接口則和QMap一樣,基於效率考量,要是沒有對資料進行修改,使用唯讀迭代器較好。


Java風格迭代器: Java風格的迭代器比起STL風格的更方便,代價就是不如STL風格高效。

容器
唯讀迭代器讀寫迭代器
QList < T >
QQueue < T >
QListIterator< T >QMutableListIterator
< T >
QLinkedList< T >QLinkedListIterator< T >QMutableLinkedListIterator< T >
QVector< T >
QStack< T >
QVectorIterator< T >QMutableVectorIterator< T >
QSet< T >QSetIterator< T >QMutableSetIterator< T >
QMap< Key, T >
QMultiMap< Key, T >
QMapIterator< T >QMutableMapIterator< T >
QHash< Key, T >
QMultiHash< Key, T >
QHashIterator< T >QMutableHashIterator< T >

以下展示QList的迭代器使用,QLinkedList、QVector和QSet的迭代器介面與QList一樣,我們先對QList設定資料,接著用讀寫迭代器對QList的資料進行更改,最後再設定一新的唯讀迭代器顯現資料。

#include <QCoreApplication>
#include<QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<int> myList;
    myList<<1<<2<<3<<4<<5;
    QListIterator<int> i(myList);
    while(i.hasNext()){
        qDebug()<<i.next();
    }

    QMutableListIterator<int> mi(myList);
    while(mi.hasNext()){
        mi.next() += 5;
    }

    QListIterator<int> changed_i(myList);
    while(changed_i.hasNext()){
        qDebug()<<changed_i.next();
    }
    return 0;
}

以下展示QMap迭代器的使用,QHash迭代器的介面使用和QMap相同,我們先對QMap設定資料,接著用讀寫迭代器對QMap的資料進行更改,最後再設定一新的唯讀迭代器顯現資料,iterator::key()函式回傳QMap的key值,iterator::value()函式回傳相對值。

#include <QCoreApplication>
#include<QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString,int> map;
    map.insert("mike",80);
    map.insert("john",70);
    QMapIterator<QString,int> i(map);
    while(i.hasNext()){
        qDebug()<<"  "<<i.key()<<"  "<<i.next().value();
    }

    QMutableMapIterator<QString,int> mi(map);
    if(mi.findNext(80)){
        mi.setValue(90);
    }

    QMapIterator<QString,int> changedMi(map);
    qDebug()<<"  ";
    while(changedMi.hasNext()){
        qDebug()<<" "<<changedMi.key()<<"  "<<changedMi.next().value();
    }
    return 0;
}

STL風格迭代器: 這種迭代器能夠兼容Qt和STL的通用算法,並且對速度進行了優化,迭代器同樣有兩種:一種提供唯讀訪問,一種提供讀寫訪問。

容器
唯讀迭代器讀寫迭代器
QList< T >
QQueue< T >
QList< T >::const_iteratorQList< T >::iterator
QLinkedList< T >QLinkedList< T >::const_iteratorQVector< T >::iterator
QVector< T >
QStack< T >
QVector< T >::const_iteratorQVector< T >::iterator
QSet< T >QSet< T >::const_iteratorQSet< T >::iterator
QMap< Key, T >
QMultiMap< Key, T >
QMap< Key, T >::const_iteratorQMap< Key, T >::iterator
QHash< Key, T >
QMultiHash< Key, T >
QHash< Key, T >::const_iteratorQHash< Key, T >::iterator

以下展示QList的迭代器使用,同樣基於效率考量,要是沒有對資料進行修改,使用唯讀迭代器較好,兩種迭代器寫法相同,只是將iterator改成const_iterator。

#include <QCoreApplication>
#include<QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<int> myList;
    myList<<1<<2<<3<<4<<5;
    QList<int>::const_iterator myIterator;
    for(myIterator = myList.constBegin(); myIterator != myList.constEnd(); ++myIterator) {
        qDebug() << *myIterator;
    }
}

以下展示QMap迭代器的使用,QHash迭代器的介面使用和QMap相同,我們先對QMap設定資料,接著用讀寫迭代器對QMap的資料進行更改,最後再設定一新的唯讀迭代器顯現資料。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QMap<QString,int> map;
    map.insert("mike",70);
    map.insert("john",80);

    QMap<QString,int>::const_iterator i;
    for(i=map.constBegin();i!=map.constEnd();++i){
        qDebug()<<"  "<<i.key()<<"  "<<i.value();
    }

    QMap<QString,int>::iterator mi;
    mi = map.find("mike");
    mi.value() = 90;

    QMap<QString,int>::const_iterator changed_i;
    qDebug()<<"  ";
    for(changed_i=map.constBegin();changed_i!=map.constEnd();++changed_i){
        qDebug()<<"  "<<changed_i.key()<<"  "<<changed_i.value();
    }
    return 0;
}