容器类的迭代
Java类型迭代器
两个Java类型迭代器:
- 用于只读操作
- 用于读写操作
| 容器类 | 只读迭代器 | 读写迭代器 |
|---|---|---|
QList<T>,QQueue<T> |
QListIterator<T> |
QMutableListIterator<T> |
QLinkedList<T> |
QLinkedListIterator<T> |
QMutableLinkedListIterator<T> |
QVector<T>,QStack<T> |
QVectorIterator<T> |
QMutbaleVectorIterator<T> |
QSet<T> |
QSetIterator<T> |
QMutableSetIterator<T> |
QMap<Key, T>,QMultiMap<Key, T> |
QMapIterator<Key, T> |
QMutableMapIterator<Key, T> |
QHash<Key, T>,QMultiHash<Key, T> |
QHashIterator<Key, T> |
QMutableHashIterator<Key, T> |
QMap和QHash等关联荣区的迭代器用法相同,QList和QLinkedList、QSet等容器类的用法相同。
顺序容器类的迭代器使用
示例如下:
cpp
QList<QString> list;
list << "A" << "B" << "C" << "D";
QListIterator<QString> iter(list);
while(iter.hasNext()) {
qDebug() << iter.next();
}
// 也可以反向遍历
while(iter.hasPrevious()) {
qDebug() << iter.previous();
}
QListIterator常用函数
| 函数名 | 功能 |
|---|---|
| void toFront() | 迭代器移动到列表的最前面(第一个数据项之前) |
| void toBack() | 迭代器移动到列表的最后面(最后一个数据项之后) |
| bool hasNext() | 如果迭代器不是位于列表最后位置,返回true |
| const T &next() | 返回下一个数据项,并且迭代器后移一个位置 |
| const T &peekNext() | 返回下一个数据项,迭代器不移动 |
| bool hasPrevious() | 如果迭代器不是位于列表最前面,返回true |
| const T &previous() | 返回前一个数据项,并且迭代器前移一个位置 |
| const T &peekPrevious() | 返回前一个数据项,迭代器不移动 |
!Note
QListIterator只能访问容器内的数据项,不能修改,如果有修改需求,使用带mutable版本的迭代器。
关联容器的迭代器使用
示例:
cpp
QMap<QString, QString> map;
map["Paris"] = "France";
map["New York"] = "USA";
map["Bei Jing"] = "China";
QMutableMapIterator<QString, QString> iter(map);
while(iter.hasNext()) {
if(iter.next().key().endsWith("City")) {
iter.remove();
}
}
其实用法和前面的顺序容器差不多,就是加了key-value而已。
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> |
QMap<Key, T>::const_iterator |
QMap<Key, T>::iterator |
QMultiMap<Key, T> |
QMap<Key, T>::const_iterator |
QMap<Key, T>::iterator |
QHash<Key, T> |
QHash<Key, T>::const_iterator |
QHash<Key, T>::iterator |
QMultiHash<Key, T> |
QHash<Key, T>::const_iterator |
QHash<Key, T>::iterator |
STL类型的迭代器是数组的指针,所以++运算符使迭代器指向下一个数据项,*运算符返回数据项的内容
示例:
cpp
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::const_iterator iter;
for (iter = list.constBegin(); iter != iter.constEnd(); ++iter) {
qDebug() << *iter;
}
QMap<QString, QString> map;
map["Paris"] = "France";
map["New York"] = "USA";
map["Bei Jing"] = "China";
for(QMap<QString, QString>::const_iterator it = map.constBegin(); it != map.constEnd(); ++iter) {
qDebug() << it.key() << " : " << it.value();
}
foreach关键字
如果指向遍历容器中的所有项,可以使用foreach关键字:
cpp
foreach(variable, container)
示例:
cpp
QList<QString> list;
...
foreach(QString str, list) {
qDebug () << str;
}
QMap<QString, int> map;
foreach(const QString &str, map.keys()) {
qDebug() << str << ": " << map.value(str);
}