Qt之容器遍历使用教程

Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。


Java 风格的遍历器

Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。

| 容器           | 只读遍历器          | 读写遍历器                 |
| QList,QQueue     | QListIterator       | QMutableListIterator       |
| QLinkedList      | QLinkedListIterator | QMutableLinkedListIterator |
| QVector,QStack   | QVectorIterator     | QMutableVectorIterator     |
| QSet             | QSetIterator        | QMutableSetIterator        |
| QMap,QMultiMap   | QMapIterator        | QMutableMapIterator        |
| QHash,QMultiHash | QHashIterator       | QMutableHashIterator       |
QList<QString> list;
list << "A" << "B" << "C" << "D";

QListIterator<QString> i(list);
while (i.hasNext()) {
    qDebug() << i.next(); 
}

QMutableListIterator<int> i(list);
while (i.hasNext()) {
    if (i.next() == “B”) {
    i.setValue(“b”);     //i.next()="b";
    }
}
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 的通用算法,并且为速度进行了优化。

| 容器             | 只读遍历器                  | 读写遍历器            |
| QList,QQueue     | QList::const_iterator       | QList::iterator       |
| QLinkedList      | QLinkedList::const_iterator | QLinkedList::iterator |
| QVector,QStack   | QVector::const_iterator     | QVector::iterator     |
| QSet             | QSet::const_iterator        | QSet::iterator        |
| QMap,QMultiMap   | QMap::const_iterator        | QMap::iterator        |
| QHash,QMultiHash | QHash::const_iterator       | QHash::iter           |
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<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 特有的

QLinkedList<QString> list;
...
QString str;
foreach (str, list) {
    qDebug() << str;
}