Qtのforeachキーワード
foreachキーワード
注: foreach キーワードは 、C++11 の範囲ベースのループが導入される前に導入されました。新しいコードでは、C++11 の範囲ベースのループを使用することを推奨します。
foreach キーワードは、C++言語へのQt固有の追加機能であり、プリプロセッサを使用して実装されています。
その構文は、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 は (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 XMLは、foreach ループに入る際に、自動的にコンテナのコピーを作成します。反復処理中にコンテナを変更しても、ループには影響しません。(コンテナを変更しなくてもコピーは行われますが、暗黙の共有のおかげで、コンテナのコピーは非常に高速です。)
foreach はコンテナのコピーを作成するため、変数に非 const の参照を使用しても、元のコンテナを変更することはできません。変更が反映されるのはコピーのみであり、おそらくそれは意図した動作ではないでしょう。
Qtのforeach ループの代替として、C++11以降で導入された範囲ベースのfor があります。ただし、範囲ベースの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.