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、QVector和QSet的遍歷器介面與QList的是一樣的;QHash遍歷器的介面則同QMap是一樣的。
我們通過下面的程式碼看看如何使用這種遍歷器:
點選(此處)摺疊或開啟
-
QList<QString> list;
-
list << "A" << "B" << "C" << "D";
-
QListIterator<QString> i(list);
-
while (i.hasNext()) {
-
qDebug() << i.next();
- }
如果需要修改操作,我們可以使用QMutableListIterator。來看下面的程式碼:
點選(此處)摺疊或開啟
-
QMutableListIterator<int> i(list);
-
while (i.hasNext()) {
-
if (i.next() == “B”) {
-
i.setValue(“b”); //i.next()="b";
-
}
- }
QMapItrator也是類似的。例如,
點選(此處)摺疊或開啟
-
QMap<int, QString> map;
-
map.insert(1,"A");
-
map.insert(2,"B");
-
map.insert(3,"C");
-
QMapIterator<int, QString> i(map);
-
while (i.hasNext()) {
-
if(i.next().key() == 2)
-
qDebug() << i.value();
- }
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的相關程式碼:
點選(此處)摺疊或開啟
-
QList<QString> list;
-
list << "A" << "B" << "C" << "D";
-
QList<QString>::iterator
i;
-
for (i = list.begin(); i != list.end(); ++i) {
-
*i = (*i).toLower(); // 使用 * 運算子獲取遍歷器所指的元素
-
qDebug()<<*i;
- }
QMap和QHash的遍歷器,* 運算子返回集合鍵值對。下面的程式碼,我們打印出QMap的所有元素:
點選(此處)摺疊或開啟
-
QMap<int, int> map;
-
QMap<int, int>::const_iterator
i;
-
for (i = map.constBegin(); i != map.constEnd(); ++i) {
-
qDebug() << i.key() << ":" << i.value();
- }
foreach關鍵字
如果我們僅僅想要遍歷集合所有元素,我們可以使用 Qt 的foreach關鍵字。這個關鍵字是 Qt 特有的,
例如,我們使用foreach對QLinkedList進行遍歷:
點選(此處)摺疊或開啟
-
QLinkedList<QString> list;
-
...
-
QString str;
-
foreach (str, list) {
-
qDebug() << str;
- }
本文轉自:點選開啟連結,轉載請標明出處