QT学习笔记(九):遍历容器-迭代器(iterators)
QT学习笔记(九):遍历容器-迭代器(iterators)
- 遍历容器 :
- 1、Jave风格:
- 2、STL风格:
- 3、foreach 关键字:
遍历容器 :
遍历一个容器可以使用迭代器(iterators)完成,迭代器提供一个统一的方法来访问容器中的项目。
迭代器:Jave风格、STL(标准模板库(Standard Template Library))风格;当容器中的数据被修改后或由于调用了non-const成员函数导致其脱离了隐式共享,那么这两种迭代器都会失效。
两者比较:
Jave较STL使用方便,但性能上较弱与后者。
Jave风格迭代器:只读访问、读写访问;
1、Jave风格:
QList 迭代器示例:
#include <QCoreApplication>
#include <QList>
#include <QListIterator>
#include <QMutableListIterator>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<QString> list;list << "A" << "B" << "C" << "D";// 创建列表的只读迭代器,将list作为参数QListIterator<QString> i(list); qDebug() << "the forward is :";while (i.hasNext()) // 正向遍历列表,结果为A,B,C,DqDebug() << i.next();qDebug() << "the backward is :";while (i.hasPrevious()) // 反向遍历列表,结果为D,C,B,AqDebug() << i.previous();// 创建列表的读写迭代器,将list作为参数QMutableListIterator<QString> j(list);j.toBack(); // 返回列表尾部while (j.hasPrevious()) {QString str = j.previous();if(str == "B") j.remove(); // 删除项目“B”}j.insert("Q"); // 在列表最前面添加项目“Q”j.toBack();if(j.hasPrevious()){j.previous() = "N"; // 直接赋值}j.previous(); // 返回前一个项目,并回移一格j.setValue("M"); // 使用setValue()进行赋值j.toFront();qDebug()<< "the forward is :";while (j.hasNext()) // 正向遍历列表,结果为Q,A,M,NqDebug() << j.next();return a.exec();
}
运行结果:
QMap 迭代器示例:
#include <QCoreApplication>
#include <QMapIterator>
#include <QMutableMapIterator>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QMap<QString, QString> map;map.insert("Paris", "France");map.insert("Guatemala City", "Guatemala");map.insert("Mexico City", "Mexico");map.insert("Moscow", "Russia");// 创建Map的只读迭代器,将map作为参数QMapIterator<QString,QString> i(map);while(i.hasNext()) // 正向遍历 map{i.next();qDebug() << i.key() << " : " << i.value();}if(i.findPrevious("Mexico")) {qDebug() << "find 'Mexico'"; // 向前查找键的值}// 创建Map的读/写迭代器,将map作为参数QMutableMapIterator<QString, QString> j(map);while (j.hasNext()) {if (j.next().key().endsWith("City")) // endsWith()是QString类的函数j.remove(); // 删除含有“City”结尾的键的项目}while(j.hasPrevious()) {j.previous(); // 现在的键值对为 (paris,France),(Moscow,Russia)qDebug() << j.key() << " : " << j.value();}return a.exec();
}
运行结果:
2、STL风格:
STL 风格迭代器兼容Qt和STL的通用算法,在速度上进行了优化:
QList 和QMap 综合STL 风格迭代器示例:
#include <QCoreApplication>
#include <QList>
#include <QDebug>
#include <QMap>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<QString> list;list << "A" << "B" << "C" << "D";// 使用读写迭代器QList<QString>::iterator i; qDebug() << "the forward is :";for (i = list.begin(); i != list.end(); ++i) {*i = (*i).toLower(); // 使用QString的toLower()函数转换为小写qDebug() << *i; // 结果为a,b,c,d}qDebug() << "the backward is :";while (i != list.begin()){--i;qDebug() << *i; // 结果为d,c,b,a}// 使用只读迭代器QList<QString>::const_iterator j; qDebug() << "the forward is :";for (j = list.constBegin(); j != list.constEnd(); ++j)qDebug() << *j; // 结果为a,b,c,d// QMap STL 风格迭代器使用QMap<QString, int> map;map.insert("one",1);map.insert("two",2);map.insert("three",3);QMap<QString, int>::const_iterator p;qDebug() << "the forward is :";for (p = map.constBegin(); p != map.constEnd(); ++p)qDebug() << p.key() << ":" << p.value(); // 结果为(one,1),(three,3),(two,2)return a.exec();
}
运行结果:
3、foreach 关键字:
如果你只是想顺序的变量容器中的所以元素,可以使用Qt的foreach关键字。这个关键字是Qt特定的,是使用预处理器实现的。
它的语法是:
foreach(variable, container) statement;
例如,下面的代码说明了怎么使用foreach来迭代QLinkedList:
QLinkedList<QString> list;...
QString str;
foreach (str, list)qDebug() << str;
QList 和QMap foreach 遍历示例:
#include <QCoreApplication>
#include <QList>
#include <QMap>
#include <QMultiMap>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<QString> list;list.insert(0, "A");list.insert(1, "B");list.insert(2, "C");qDebug() <<"the list is :";foreach (QString str, list) // 从list中获取每一项{ qDebug() << str; // 结果为A,B,C}QMap<QString,int> map;map.insert("first", 1);map.insert("second", 2);map.insert("third", 3);qDebug() << endl << "the map is :";foreach (QString str, map.keys()) // 从map中获取每一个键 qDebug() << str << " : " << map.value(str); // 输出键和对应的值,结果为(first,1),(second,2),(third,3)QMultiMap<QString,int> map2;map2.insert("first", 1);map2.insert("first", 2);map2.insert("first", 3);map2.insert("second", 2);qDebug() << endl << "the map2 is :";QList<QString> keys = map2.uniqueKeys(); // 返回所有键的列表foreach (QString str, keys) // 遍历所有的键{ foreach (int i, map2.values(str)) // 遍历键中所有的值qDebug() << str << " : " << i;}// 结果为(first,3),(first,2),(first,1),(second,2)return a.exec();
}
运行结果:
QT学习笔记(九):遍历容器-迭代器(iterators)相关推荐
- QT学习笔记(八):顺序容器和关联容器
QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...
- 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】
本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...
- QT学习笔记(十):通用算法示例
QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...
- QT学习笔记(摘抄)
QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...
- OpenCV学习笔记(九)——图像轮廓(下)
<OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...
- 【QT学习笔记】基于QT的天气预报
[QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...
- QT 学习笔记(六)
文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...
- Go学习笔记06-内建容器
Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0 var ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
最新文章
- fmt打印不显示 go_程序猿学Go: 日志系统
- 错误消息 This computer doesn‘t have VT-X/AMD-v enabled
- bootstraptable 日期控件_bootstrap table插件使用说明demo
- android获取设备的唯一编号,android如何获取设备的唯一设备码
- 机器学习笔记(2):线性回归-使用gluon
- iOS核心动画Core Animation(一)
- 整理学习之多任务学习
- 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
- uniapp 微信支付功能
- 计算机无法进入bios模式,电脑系统无法进入bios界面解决方法
- 联想 计算机无线网络设置方法,联想g400如何打开无线_联想G400s笔记本电脑无线开关在哪-win7之家...
- C++序列容器之 vector常见用法总结
- vcu整车simulink模型
- get 到的html代码如何转码,爬虫网页转码逻辑
- c51语言中数据的存储类型,C51-数据存储类型
- Matlab:利用Matlab软件进行GUI界面设计实现图像的基本操作
- doctype的作用,标准模式和兼容模式的区别
- 汇川H5U走EtherCat控制伺服带HMI程序,轴控制和气缸控制有做功能块
- 贵州的程序员年薪都40万不止,和你差在哪里?
- 自动驾驶车什么时候普及,自动驾驶还有多久普及