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)相关推荐

  1. QT学习笔记(八):顺序容器和关联容器

    QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...

  2. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

  3. QT学习笔记(十):通用算法示例

    QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...

  4. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  5. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  6. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

  7. QT 学习笔记(六)

    文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...

  8. Go学习笔记06-内建容器

    Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0 var ...

  9. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

最新文章

  1. fmt打印不显示 go_程序猿学Go: 日志系统
  2. 错误消息 This computer doesn‘t have VT-X/AMD-v enabled
  3. bootstraptable 日期控件_bootstrap table插件使用说明demo
  4. android获取设备的唯一编号,android如何获取设备的唯一设备码
  5. 机器学习笔记(2):线性回归-使用gluon
  6. iOS核心动画Core Animation(一)
  7. 整理学习之多任务学习
  8. 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
  9. uniapp 微信支付功能
  10. 计算机无法进入bios模式,电脑系统无法进入bios界面解决方法
  11. 联想 计算机无线网络设置方法,联想g400如何打开无线_联想G400s笔记本电脑无线开关在哪-win7之家...
  12. C++序列容器之 vector常见用法总结
  13. vcu整车simulink模型
  14. get 到的html代码如何转码,爬虫网页转码逻辑
  15. c51语言中数据的存储类型,C51-数据存储类型
  16. Matlab:利用Matlab软件进行GUI界面设计实现图像的基本操作
  17. doctype的作用,标准模式和兼容模式的区别
  18. 汇川H5U走EtherCat控制伺服带HMI程序,轴控制和气缸控制有做功能块
  19. 贵州的程序员年薪都40万不止,和你差在哪里?
  20. 自动驾驶车什么时候普及,自动驾驶还有多久普及

热门文章

  1. 闲鱼账号被封怎么办?解封看这里!
  2. 非常全面的阿里的Java面试题目,涵盖Java基础+高级+架构
  3. 论文浅尝 | NumNet: 一种带有数学推理的机器阅读理解模型
  4. 基于PaddleRec的用户点击率预测
  5. 268G+训练好的word2vec模型(中文词向量)
  6. Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式
  7. 【数据挖掘】数据挖掘和数据分析基础
  8. [转载]eXeScope 6.50本地溢出分析
  9. NuGet version
  10. mybatis自学笔记-1