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 (const QString &str, values) { if (str.isEmpty()) break; qDebug() << str; }
QMap 、QHash 、foreach
は、自動的に(キー、値)ペアの値コンポーネントにアクセスするので、コンテナ上でvalues()を呼び出すべきではありません(不要なコピーが生成されます。)キーと値の両方を繰り返し処理したい場合は、イテレータを使用するか(その方が高速)、キーを取得してそれを使用して値も取得できます:
QMap<QString, int> map; ... foreach (const QString &str, map.keys()) qDebug() << str << ':' << map.value(str);
多値マップの場合:
QMultiMap<QString, int> map; ... foreach (const QString &str, map.uniqueKeys()) { foreach (int i, 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
ループを使用できなくすることができます。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。