Spec-Zone.ru › Qt 6.1

Ключевое слово 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 создаёт копию контейнера, использование неконстантной ссылки для переменной не позволяет изменять исходный контейнер. Это влияет только на копию, что, вероятно, не является желаемым результатом.

Альтернативой циклу foreach Qt является цикл с диапазоном 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.0/foreach-keyword.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API