0、说明

Qt提供一个关键字foreach(实际上是<QtGlobal>中定义的一个宏)用于方便地访问容器中的所有数据项。

foreach关键字用于遍历容器中的所有数据项

注意

foreach是Read-Only迭代器,不能用它去修改容器中的值。

1、用法

1.1、常用

foreach (variable , container)

使用foreach代码比使用迭代器更简洁。

例如,使用foreach遍历一个QLinkedList<QString>的实例代码如下:

QLinkedList<QString> list;
...
QString str;
foreach (str,list)
qDebug() << str;

1.2、临时变量在foreach中定义

如果迭代遍历在foreach中定义,需要写成这种形式:

foreach( const QString &str , list )

此外,在foreach语句中也可以使用花括号,并用break退出迭代:

QLinkedList<QString> list;
...
foreach(const QString &str ,list){
if(str.isEmpty())
break;
qDebug() << str;
}

1.3、在QMap上使用foreach

而对于QMap和QHash,foreach会自动访问Key-Value中的Value,所以无需调用values()。如果要访问Key则可以调用keys(),示例代码如下:

QMap<QString , int> map;
...
foreach(const QString & str , map.keys())
qDebug() << str <<':'<<map.value(str);

1.4、嵌套的foreach

对于多值映射,可以以使用两重foreach语句,示例代码如下:

QMultiMap<QString , int>map
...
foreach(const QString & str , map.uniqueKeys()){
foreach(int i, map.values(str))
qDebug()<<str<<':'<<i;
}

注意,foreach遍历一个容器变量是创建了容器的副本,所以不能修改原容器变量的数据项。

总结

  • foreach是一种简便的用于迭代容器的方式;
  • 用法类似于Java中的foreach语法:
    foreach(variable , container)

    使用时的三种写法:

    QLink<QString> list;
    ... //①
    QString str;
    foreach(str,list)
    qDebug() << str; //②
    foreach( const QString & str , list ){
    if(str.isEmpty())
    break;
    qDebug() << str;
    } //③
    foreach ( QString str , list ){
    qDebug() << str;
    }
  • 用foreach访问关联类容器如QMap和QHash时,默认访问Value,如果想访问Key,可以把foreach的第二项改为调用keys()函数:
    //默认访问Value
    QMap <QString , int> map;
    ...
    foreach( const int & n , map)
    qDebug()<<n; //如果想访问Key
    ...
    foreach(const QString & str , map.keys())
    qDebug()<<str<<':'<<map.values(str);

    对于多值映射,需要用两重foreach:

    QMultiMap<QString,int> map;
    ...
    foreach(QString str , map.uniqueKeys())
    foreach(int i , map.values(str))
    qDebug()<< str << ':' << i;
  • 不能通过foreach修改数据项,它是只读迭代器

Qt:foreach的更多相关文章

  1. QT中foreach的使用

    在标准C++中,并没有foreach关键字. 但是在QT中,可以使用这一个关键字,其主要原因是QT自己增加了这一个关键字,就像slots和signals.emit等一样.增加的foreach关键字在编 ...

  2. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  3. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  4. Java:foreach实现原理

    第一部分: For-each Loop Purpose The basic for loop was extended in Java5 to make iteration over arrays a ...

  5. 编写高质量代码改善C#程序的157个建议——建议18:foreach不能代替for

    建议18:foreach不能代替for 上一个建议中提到了foreach的两个优点:语法更简单,默认调用Dispose方法,所有我们强烈建议在实际的代码编写中更多的使用foreach.但是,该建议也有 ...

  6. (JavaScript基础向)日常小发现:forEach等函数的第二个参数的用法

    forEach函数用得平时用得比较多,但是从来没想到forEach函数还有第二个参数. 这里是菜鸟教程对forEach函数的详细说明:forEach的详细说明. 如上图,forEach函数有第二个参数 ...

  7. C#:foreach语句,yield语句

    原文:C#:foreach语句,yield语句 1. foreach语句 C#编译器会把foreach语句转换为IEnumerable接口的方法和属性. foreach (Person p in pe ...

  8. 如何让类数组也使用数组的方法比如:forEach()

    思路: 让类数组绑定数组的方法<div>1</div><div>2</div>方法一: let div = document.getElementsBy ...

  9. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

随机推荐

  1. 不难懂——CSS 匹配指定name元素

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. JS基础语法(二)

    目录 JavaScript基础语法(二) 八. 函数 1. 函数的概念 2. 函数的使用 声明函数 调用函数 3. 函数的封装 4. 函数的参数 函数的参数匹配问题 5. 函数返回值 6. argum ...

  3. windows下使用LTP分词,安装pyltp

    1.LTP介绍 ltp是哈工大出品的自然语言处理工具箱, 提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然语言处理技术.pyltp是python下对ltp ...

  4. Mac iterm2 配色以及终端大小写敏感解决方案

    iterm2是mac下非常好用的一款终端.但默认的配色实在不好用,经过一翻搜索终于找到了比较满意的,以下贴出博主的解决方案 配色 首先修改 ~/.bash_profile 加入一下代码 #enable ...

  5. django入门 02 初探app、view、url、templates、static

    创建APP命令 python manage.py startapp myapp app组成介绍 如上图,在终端中展示树状结构-- windows为 tree /f macOS为 tree 注册APP ...

  6. APC 篇——总结与提升

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  7. Web3对于我们普通人意味着什么?

    ▲ 点击101链视界,关注不走丢 大家好,我是阿创,这是我的第27篇原创文章. 上一篇文章中我们了解了互联网的前世今生:Web 1.0.2.0.3.0,我们对Web的前两个阶段都不陌生,特别是 Web ...

  8. JAVA变量初始化赋值问题

    感谢大佬:https://www.cnblogs.com/znsongshu/p/6282672.html 在Java中,null值表示引用不指向任何对象.运行过程中系统发现使用了这样一个引用时·可以 ...

  9. shell下快捷键

    ### 1.快捷键 ^C   终止前台运行的程序 ^D   退出 等价于exit ^L   清屏 ^A   光标移动到命令行的最前端 ^E   光标移动到命令行的最后端 ^U   删除光标前所有字符 ...

  10. HOOK API(三) —— HOOK 所有程序的 MessageBox

    转载来源:https://www.cnblogs.com/hookjc/ 0x00 前言 本实例要实现HOOK MessageBox,包括MessageBoxA和MessageBoxW,其实现细节与H ...