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);
}
相关推荐
apcipot_rain5 小时前
C++转Java日记(04)
java·开发语言·c++
sycmancia5 小时前
Qml——信号连接、自定义信号
qt
云和数据.ChenGuang6 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
WL学习笔记7 小时前
vector模拟实现
c++
蜗牛一步步往上爬9 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
张张123y11 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
wo_jack13 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH14 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶14 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing0315 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2