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> |
这里我们只讨论QList 和QMap 的遍历器。QLinkedList 、QVector 和QSet 的遍历器接口与QList 的是一样的;QHash 遍历器的接口则同QMap是一样的。 |
||
我们通过下面的代码看看如何使用这种遍历器: |
1 | QList<QString> list; |
首先,我们使用list对象创建一个遍历器。创建完成是,该遍历器位于第一个元素之前(也就是A之前)。我们通过调用hasNext
函数判断遍历器之后的位置上有无元素。如果有,调用next()
函数将遍历器跳过其后的元素。next()
函数返回刚刚跳过的元素。
QListiterator
是只读遍历器,不能插入或者删除数据。如果需要这些操作,我们可以使用QMutableListIterator
。来看下面代码:
1 | QMutableListIterator<int> i(list); |
这段代码使用QMutableListIterator
遍历集合,如果其值是奇数则将其删除。在每次循环中都要调用next()
函数。正如前面所说,它会跳过其后的一个元素。remove()
函数会删除我们刚刚跳过的元素。调用remove()
函数并不会将遍历器置位不可用,因此我们可以连续调用这个函数。向前遍历也是类似的,这里不再赘述。
如果我们需要修改已经存在的元素,使用setValue()
函数。
1 | QMutableListIterator<int> i(list); |
QMapItrator
也是类似的。例如,使用QMapItrator
我们可以将数据从QMap
复制到QHash
1 | QMap<int, QWidget *> map; |