Ключевое слово foreach Qt
Ключевое слово foreach
Примечание: Ключевое слово foreach было введено до появления циклов с диапазоном C++11. В новом коде следует отдавать предпочтение циклам с диапазоном C++11.
Ключевое слово foreach — это специфичное для Qt дополнение к языку C++, реализованное с использованием препроцессора.
Его синтаксис: 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())
qDebug() << i.next(); Если тип данных не содержит запятой (например, QPair<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;
} Для 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 создает копию контейнера, использование неконстантной ссылки для переменной не позволяет изменять исходный контейнер. Она влияет только на копию, что, вероятно, не является желаемым результатом.
Альтернативой циклу Qt foreach является цикл с диапазоном for, который является частью C++11 и более новых версий. Однако помните, что цикл с диапазоном for может заставить Qt-контейнер отсоединиться, в то время как foreach этого не сделает. Но использование foreach всегда копирует контейнер, что обычно не является эффективным для контейнеров STL. В случае сомнений, используйте foreach для Qt-контейнеров и цикл с диапазоном for для контейнеров STL.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/foreach-keyword.html