Цикл по QMap

16 октября 2024

Qt 6.4 и более поздние версии

Используйте QMap::asKeyValueRange следующим образом:

for (auto [key, value] : map.asKeyValueRange())
{
    qDebug() << key << value;
}

С Qt 5.10 по Qt 6.3

Используйте QMap::keyValueBegin и QMap::keyValueEnd следующим образом:

for (auto it = map.keyValueBegin(); it != map.keyValueEnd(); ++it)
{
    qDebug() << it->first << it->second;
}

Функция QMap::asKeyValueRange может быть перенесена из Qt 6.4 с помощью всего нескольких строк кода, что позволяет использовать диапазоны значений ключей в Qt 5.10 и Qt 6.3 (требуется C++17):

for (auto [key, value] : asKeyValueRange(map))
​​​​​​​{
    qDebug() << key << value;
}

С Qt 4 по Qt 5.9

Используйте QMap::begin и QMap::end следующим образом:

for (auto it = map.begin(); it != map.end(); ++it)
​​​​​​​{
    qDebug() << it.key() << it.value();
}

Цикл можно обернуть в диапазон с помощью нескольких строк дополнительного кода, что позволит использовать циклы на основе диапазонов for в Qt 4 и Qt 5.9 (требуется C++11):

for (auto it : toRange(map))
​​​​​​​{
    qDebug() << it.key() << it.value();
}

Другие варианты

Используйте QMap::toStdMap, чтобы преобразовать карту в std::map и затем выполнить итерацию по ней. Обратите внимание, что производительность будет низкой, так как при этом будет скопирована вся карта.

for (auto it : map.toStdMap())
​​​​​​​{
    qDebug() << it.first << it.second;
}

Переберите QMap::keys и найдите каждое связанное с ним QMap::value. Обратите внимание, что производительность будет крайне низкой, так как при этом будут скопированы все ключи, а затем отдельно будет выполняться поиск каждого значения.

for (auto key : map.keys())
​​​​​​​{
    qDebug() << key << map.value(key);
}