Qtのforeachキーワード

foreach キーワード

注意: foreach キーワードは、C++11 の範囲ベースのループが存在する前に導入されました。新しいコードでは、C++11 の範囲ベースのループを使用する必要があります。

foreach キーワードは C++ 言語に追加された Qt 固有のもので、プリプロセッサを使用して実装されます。

その構文は次のとおりです: foreach (変数コンテナ。例えば、foreach を使ってQList<QString> を反復処理する方法を示します:

QList<QString> values;
...
QString str;
foreach (str, values)
    qDebug() << str;

foreach のコードは、イテレーターを使った同等のコードよりもかなり短い:

QList<QString> values;
...
QListIterator<QString> i(values);
while (i.hasNext()) {
    QString s = i.next();
    qDebug() << s;
}

データ型にカンマが含まれていない限り(例えば、std::pair<int, int> )、イテレーションに使用する変数はforeach ステートメント内で定義することができます:

QList<QString> values;
...
foreach (const QString &str, values)
    qDebug() << str;

また、他のC++ループ構文と同様に、foreach ループの本体を中括弧で囲むことができ、break を使ってループを抜けることができる:

QList<QString> values;
...
foreach (const QString &str, values) {
    if (str.isEmpty())
        break;
    qDebug() << str;
}

QMapQHashforeach は、自動的に(キー、値)ペアの値コンポーネントにアクセスするので、コンテナ上で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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。