Qt 的 foreach 关键字
foreach 关键字
注意: foreach 关键字是在 C++11 基于范围的循环出现之前引入的。新代码应优先使用 C++11 基于范围的循环。
foreach 关键字是 Qt 对 C++ 语言的特定扩展,并通过预处理器实现。
其语法为:foreach (变量,容器)语句。例如,以下是使用 `foreach ` 遍历 `QList<QString>` 的方法:
foreach 的代码比使用迭代器的等效代码要短得多:
QList<QString>values;
//...
QListIterator<QString>i(values);
while(i.hasNext()) {
QString s=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 会自动访问 (键, 值) 对中的值部分,因此不应在容器上调用 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;
}当进入foreach 循环时,Qt会自动对容器进行复制。如果你在迭代过程中修改了容器,这不会影响循环。(即使你不修改容器,复制操作仍会发生,但得益于隐式共享,容器的复制速度非常快。)
由于 foreach 会创建容器的副本,因此如果将变量声明为非 const 引用,则无法修改原始容器。修改只会影响副本,这可能并非您所期望的结果。
Qt XML 的foreach 循环的一种替代方案是基于范围的for ,它是 C++11 及更高版本的一部分。不过请注意,基于范围的for 可能会迫使 Qt 容器解耦,而foreach 则不会。但使用foreach 总是会复制容器,这对 STL 容器来说通常并不高效。 如有疑问,对于 Qt 容器,建议优先使用foreach ;对于 STL 容器,则建议使用基于范围的for 。
您可以通过定义QT_NO_FOREACH 宏来禁用Qt XML的foreach 循环。
© 2026 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.