Qtのforeachキーワード
foreach キーワード
注意: foreach キーワードは、C++11 の範囲ベースのループが存在する前に導入されました。新しいコードでは、C++11 の範囲ベースのループを使用する必要があります。
foreach
キーワードは C++ 言語に追加された Qt 固有のもので、プリプロセッサを使用して実装されます。
その構文は次のとおりです: foreach
(変数、コンテナ)文。例えば、foreach
を使ってQList<QString> を反復処理する方法を示します:
foreach
のコードは、イテレータを使った同等のコードよりも大幅に短い:
QList<QString>値;...QListIterator<QString> i(values);while(i.hasNext()) { s = i.next(); ... 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
は、自動的に(キー、値)ペアの値コンポーネントにアクセスするので、コンテナ上でvalues()を呼び出すべきではない(不要なコピーが生成される。)キーと値の両方を繰り返し処理したい場合は、イテレータを使用するか(その方が高速です)、キーを取得し、それを使用して値も取得できます:
QMap<QStringint>map;...foreach(constQString&str,map.keys()) qDebug() << str << ':' << map.value(str);
多値マップの場合:
QMultiMap<QStringint>map;...foreach(constQString&str,map.uniqueKeys()) { foreach(inti,map.values(str)) qDebug() << str << ':' << i; }
Qt は、foreach
ループに入ると、自動的にコンテナのコピーを取ります。反復処理中にコンテナを変更しても、ループには影響しません。(コンテナを変更しない場合でもコピーは行われますが、暗黙的な共有のおかげでコンテナのコピーは非常に高速です)。
foreachはコンテナのコピーを作成するので、変数にconstでない参照を使用しても、元のコンテナを変更することはできない。コピーにしか影響しないので、おそらく望んでいないことだろう。
Qt のforeach
ループに代わるものとして、C++11 以降の範囲ベースのfor
があります。ただし、範囲ベースのfor
では Qt コンテナが強制的に切り離される可能性がありますが、foreach
では切り離されないことに注意してください。しかし、foreach
を使用すると、常にコンテナがコピーされます。疑問があれば、Qt コンテナには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.