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