Qt 的 foreach 关键字
foreach关键字
注意: foreach 关键字是在 C++11 基于范围的循环出现之前引入的。新代码应首选基于 C++11 范围的循环。
foreach
关键字是对 C++ 语言的 Qt XML 特有补充,使用预处理器实现。
其语法为 foreach
(变量,容器)语句。例如,下面是如何使用foreach
遍历QList<QString>:
foreach
代码比使用迭代器的代码短得多:
QList<QString>值;...QListIterator<QString>i(values);while(i.hasNext()) { QStrings=i.next(); qDebug() << s; }
除非数据类型包含逗号(如std::pair<int, int>
),否则用于迭代的变量可在foreach
语句中定义:
与其他 C++ 循环结构一样,您可以在foreach
循环的主体周围使用大括号,也可以使用break
离开循环:
QList<QString>values;...foreach(constQString&str,values) {if(str.isEmpty())break; qDebug() << str; }
使用QMap 和QHash 时,foreach
会自动访问 (key, value) 对中的值分量,因此不应在容器上调用 values()(会生成不必要的副本,见下文)。如果要同时遍历键和值,可以使用迭代器(迭代器速度更快),也可以先获取键,然后再获取值:
QMap<QString, int>map;...foreach(constQString&str,map.keys()) qDebug() << str << ':' << map.value(str);
对于多值地图
QMultiMap<QString, int>map;...foreach(constQString&str,map.uniqueKeys()) { foreach(inti,map.values(str)) qDebug() << str << ':' << i; }
Qt 在进入foreach
循环时会自动获取容器的副本。如果您在迭代时修改了容器,这不会影响循环。(如果不修改容器,复制仍会进行,但由于隐式共享,复制容器的速度非常快)。
由于 foreach 会创建容器的副本,因此为变量使用非const 引用不允许修改原始容器。它只会影响副本,这可能不是你想要的。
Qt 的foreach
循环的另一个替代方法是基于范围的for
,它是 C++11 及更新版本的一部分。不过,请记住,基于范围的for
可能会强制 Qt 容器脱离,而foreach
则不会。但使用foreach
会复制容器,这对 STL 容器来说通常并不便宜。如果有疑问,Qt XML 容器应首选foreach
,STL 容器应首选基于范围的for
。
您可以通过定义QT_NO_FOREACH
宏来移除 Qt 的foreach
循环的可用性。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.