1. 程式人生 > >Qt容器(QMap/QHash etc)遍歷

Qt容器(QMap/QHash etc)遍歷

Qt 的容器類提供了兩種風格的遍歷器:Java 風格和 STL 風格

Java 風格的遍歷器

Java 風格的遍歷器是在 Qt4 首先引入的,是 Qt 應用程式首先推薦使用的形式。這種風格比起 STL 風格的遍歷器更方便。方便的代價就是不如後者高效。
Java 風格的遍歷器指向的是兩個元素之間的位置,而不是指向元素本身。因此,它們可能會指向集合第一個元素之前的位置,也可能指向集合的最後一個元素之後的位置,

每一種容器都有兩種 Java 風格的遍歷器:一種提供只讀訪問,一種提供讀寫訪問

容器

只讀遍歷器

讀寫遍歷器

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>


QLinkedList
QVectorQSet的遍歷器介面與QList的是一樣的;QHash遍歷器的介面則同QMap是一樣的

我們通過下面的程式碼看看如何使用這種遍歷器:

點選(此處)摺疊或開啟

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3. QListIterator<QString> i(list);
  4. while (i.hasNext()) {
  5.     qDebug() << i.next(); 
  6. }


如果需要修改操作,我們可以使用QMutableListIterator。來看下面的程式碼:

點選(此處)摺疊或開啟

  1. QMutableListIterator<int> i(list);
  2. while (i.hasNext()) {
  3.     if (i.next() == “B”) {
  4.         i.setValue(“b”);     //i.next()="b";
  5.     }
  6. }

QMapItrator也是類似的。例如,

點選(此處)摺疊或開啟

  1.    QMap<int, QString> map;
  2.    map.insert(1,"A");
  3.    map.insert(2,"B");
  4.    map.insert(3,"C");
  5.    QMapIterator<int, QString> i(map);
  6.    while (i.hasNext()) {
  7.        if(i.next().key() == 2)
  8.            qDebug() << i.value();
  9.    }

STL 風格的遍歷器

STL 風格的遍歷器從 Qt 2.0 就開始提供。這種遍歷器能夠相容 Qt 和 STL 的通用演算法,並且為速度進行了優化。同 Java 風格遍歷器類似,Qt 也提供了兩種 STL 風格的遍歷器:一種是隻讀訪問,一種是讀寫訪問。我們推薦儘可能使用只讀訪問,因為它們要比讀寫訪問的遍歷器快一些。

容器

只讀遍歷器

讀寫遍歷器

QList<T>,QQueue<T>

QList<T>::const_iterator

QList<T>::iterator

QLinkedList<T>

QLinkedList<T>::const_iterator

QLinkedList<T>::iterator

QVector<T>,QStack<T>

QVector<T>::const_iterator

QVector<T>::iterator

QSet<T>

QSet<T>::const_iterator

QSet<T>::iterator

QMap<Key, T>,QMultiMap<Key, T>

QMap<Key, T>::const_iterator

QMap<Key, T>::iterator

QHash<Key, T>,QMultiHash<Key, T>

QHash<Key, T>::const_iterator

QHash<Key, T>::iter


不同於 Java 風格遍歷器,STL 風格遍歷器直接指向
元素本身

下面是有關QList的相關程式碼:

點選(此處)摺疊或開啟

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3. QList<QString>::iterator i;
  4. for (= list.begin(); i != list.end(); ++i) {
  5.   *= (*i).toLower(); // 使用 * 運算子獲取遍歷器所指的元素
  6.    qDebug()<<*i;
  7. }


QMap和QHash的遍歷器,運算子返回集合鍵值對。下面的程式碼,我們打印出QMap的所有元素:

點選(此處)摺疊或開啟

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

foreach關鍵字

如果我們僅僅想要遍歷集合所有元素,我們可以使用 Qt foreach關鍵字。這個關鍵字是 Qt 特有的,

例如,我們使用foreachQLinkedList進行遍歷:


點選(此處)摺疊或開啟

  1. QLinkedList<QString> list;
  2. ...
  3. QString str;
  4. foreach (str, list) {
  5.     qDebug() << str;
  6. }

本文轉自:點選開啟連結,轉載請標明出處