Qt's foreach Schlüsselwort

Das foreach-Schlüsselwort

Hinweis: Das foreach-Schlüsselwort wurde eingeführt, bevor es die C++11-bereichsbasierten Schleifen gab. Neuer Code sollte C++11 Range-basierte Schleifen bevorzugen.

Das Schlüsselwort foreach ist eine Qt-spezifische Ergänzung der Sprache C++ und wird mit dem Präprozessor implementiert.

Seine Syntax lautet: foreach (Variable, Container) Anweisung. Ein Beispiel: So verwenden Sie foreach, um eine QList<QString> zu iterieren:

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

Der Code von foreach ist wesentlich kürzer als der entsprechende Code, der Iteratoren verwendet:

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

Sofern der Datentyp kein Komma enthält (z. B. std::pair<int, int>), kann die für die Iteration verwendete Variable innerhalb der Anweisung foreach definiert werden:

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

Und wie jedes andere C++-Schleifenkonstrukt können Sie geschweifte Klammern um den Körper einer foreach -Schleife verwenden, und Sie können break verwenden, um die Schleife zu verlassen:

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

Mit QMap und QHash greift foreach automatisch auf die Wertkomponente der (Schlüssel, Wert)-Paare zu, so dass Sie nicht values() auf dem Container aufrufen sollten (es würde eine unnötige Kopie erzeugen, siehe unten). Wenn Sie sowohl über die Schlüssel als auch über die Werte iterieren wollen, können Sie Iteratoren verwenden (die schneller sind), oder Sie können die Schlüssel abrufen und sie verwenden, um auch die Werte zu erhalten:

QMap<QString,  int> map;...foreach(const QString &str, map.keys())    qDebug() << str << ':' << map.value(str);

Bei einer mehrwertigen Karte:

QMultiMap<QString,  int> map;...foreach(const QString &str, map.uniqueKeys()) { foreach(int i, map.values(str))        qDebug() << str << ':' << i;
}

Qt nimmt automatisch eine Kopie des Containers, wenn es in eine foreach Schleife eintritt. Wenn Sie den Container während der Iteration verändern, hat dies keinen Einfluss auf die Schleife. (Wenn Sie den Container nicht verändern, findet die Kopie trotzdem statt, aber dank der impliziten Freigabe ist das Kopieren eines Containers sehr schnell).

Da foreach eine Kopie des Containers erzeugt, können Sie durch die Verwendung einer Nicht-Konst-Referenz für die Variable den ursprünglichen Container nicht verändern. Es wirkt sich nur auf die Kopie aus, was wahrscheinlich nicht das ist, was Sie wollen.

Eine Alternative zur foreach -Schleife von Qt ist die bereichsbasierte for, die Teil von C++11 und neuer ist. Bedenken Sie jedoch, dass die bereichsbasierte for einen Qt-Container dazu zwingen kann, sich zu lösen, während foreach dies nicht tut. Allerdings wird bei der Verwendung von foreach der Container immer kopiert, was bei STL-Containern normalerweise nicht billig ist. Im Zweifelsfall sollten Sie foreach für Qt-Container und for für STL-Container bevorzugen.

Sie können die Verfügbarkeit der foreach -Schleife von Qt aufheben, indem Sie das Makro QT_NO_FOREACH definieren.

© 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.