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);
}
相关推荐
shhpeng2 小时前
Go语言中 的 defer 语句
开发语言·后端·golang
不惑_2 小时前
通俗理解多层感知机(MLP)
开发语言·人工智能·python·深度学习
小徐Chao努力2 小时前
【Langchain4j-Java AI开发】02-模型参数配置与调优
java·开发语言·人工智能
一路往蓝-Anbo2 小时前
【第14期】裸机中断优先级:抢占与嵌套的逻辑
c语言·开发语言·stm32·单片机·物联网
chamu992 小时前
关于编译-__declspec(dllexport)的使用场景
c++
bjxiaxueliang2 小时前
一文详解Cpp多线程编程:从传统pthread到现代thread实践指南
java·开发语言·jvm
QQ_4376643142 小时前
C++11并发编程
开发语言·c++
leiming62 小时前
c++ 容器 queue
开发语言·c++
繁星星繁2 小时前
【项目】基于SDK实现的智能聊天助手(使用api接入deepseek)------(二)
c++·设计模式·学习方法