目录
  1. 1. Qt学习之路-遍历容器
  2. 2. java风格的遍历器
Qt学习之路10-遍历容器

Qt学习之路-遍历容器

Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。这两种风格的遍历器在通过非 const 函数对集合进行修改时都是不可用的。

java风格的遍历器

Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。它们的 API 非常类似于 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>
QHash<Key, T>,QMultiHash<Key, T> QHashIterator<T> QMutableHashIterator<T>
这里我们只讨论QListQMap的遍历器。QLinkedListQVectorQSet的遍历器接口与QList的是一样的;QHash遍历器的接口则同QMap是一样的。
我们通过下面的代码看看如何使用这种遍历器:
1
2
3
4
5
6
7
QList<QString> list;
list << "A" << "B" << "C" << "D";

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

首先,我们使用list对象创建一个遍历器。创建完成是,该遍历器位于第一个元素之前(也就是A之前)。我们通过调用hasNext函数判断遍历器之后的位置上有无元素。如果有,调用next()函数将遍历器跳过其后的元素。next()函数返回刚刚跳过的元素。

QListiterator是只读遍历器,不能插入或者删除数据。如果需要这些操作,我们可以使用QMutableListIterator。来看下面代码:

1
2
3
4
5
6
QMutableListIterator<int> i(list);
while (i.hasNext()) {
if (i.next() % 2 != 0) {
i.remove();
}
}

这段代码使用QMutableListIterator遍历集合,如果其值是奇数则将其删除。在每次循环中都要调用next()函数。正如前面所说,它会跳过其后的一个元素。remove()函数会删除我们刚刚跳过的元素。调用remove()函数并不会将遍历器置位不可用,因此我们可以连续调用这个函数。向前遍历也是类似的,这里不再赘述。

如果我们需要修改已经存在的元素,使用setValue()函数。

1
2
3
4
QMutableListIterator<int> i(list);
while (i.hasNext()) {
i.next() *= 2;
}

QMapItrator也是类似的。例如,使用QMapItrator我们可以将数据从QMap复制到QHash

1
2
3
4
5
6
7
8
QMap<int, QWidget *> map;
QHash<int, QWidget *> hash;

QMapIterator<int, QWidget *> i(map);
while (i.hasNext()) {
i.next();
hash.insert(i.key(), i.value());
}
文章作者: XyLan
文章链接: https://blog.xylan.cn/2023/04/26/Qt%E5%AD%A6%E4%B9%A0%E4%B9%8B%E8%B7%AF10-%E9%81%8D%E5%8E%86%E5%AE%B9%E5%99%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XyLan
打赏
  • 微信
  • 支付寶