Qt:容器类的迭代

容器类的迭代

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);
}
相关推荐
郝学胜_神的一滴18 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境4 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境4 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴5 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境7 天前
C++ 的Eigen 库全解析
c++
卷无止境7 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端