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);
}
相关推荐
yugi9878383 分钟前
MATLAB的多层感知器(MLP)与极限学习机(ELM)实现
开发语言·matlab
Never_Satisfied32 分钟前
C#获取汉字拼音字母方法总结
开发语言·c#
zh_xuan44 分钟前
kotlin 密封类
开发语言·kotlin
码小猿的CPP工坊1 小时前
C++软件开发之内存泄漏闭坑方法
开发语言·c++
Ethan-D1 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
Benny_Tang1 小时前
题解:CF2164C Dungeon
c++·算法
满栀5851 小时前
分页插件制作
开发语言·前端·javascript·jquery
froginwe111 小时前
C 标准库 - <stdio.h>
开发语言
zwtahql1 小时前
php源码级别调试
开发语言·php
qq_406176141 小时前
深入剖析JavaScript原型与原型链:从底层机制到实战应用
开发语言·前端·javascript·原型模式