Вы можете использовать QMap::keys()
с QMap::value()
или QMap::operator[]
, чтобы перебрать список по ключам, а затем использовать ключи для получения значений , Другим решением может быть просто получить std::map
из QMap::toStdMap()
и выполнить итерацию по нему, используя цикл range-for
.
Возможно, вы захотите взглянуть на QMap::uniqueKeys()
, также в зависимости от вашего варианта использования.
UPDATE
Как указано в ответе cuda12 , вы также можете использовать QMapIterator
или QMutableMapIterator
, в зависимости от того, что вы необходимо использовать итераторы в стиле Java, но он менее эффективен, чем итераторы в стиле STL. И это не отвечает вашему требованию использования foreach
или range-for
.
Вот цитата из документации :
Итераторы в стиле Java являются более высокоуровневыми и более простыми в использовании, чем итераторы в стиле STL; с другой стороны, они немного менее эффективны.
Вот рабочий пример:
#include <QDebug>
#include <QMap>
#include <QMapIterator>
#include <QString>
int main()
{
using InnerMap = QMap<int, QString>;
using OuterMap = QMap<int, InnerMap>;
const OuterMap outerMap
{
{ 1, {{ 11, "a" }, { 12, "aa" }} },
{ 2, {{ 22, "b" }, { 21, "bb" }} },
{ 3, {{ 22, "c" }} }
};
qDebug() << "--- foreach (QMap) ---";
foreach ( const auto& outerKey, outerMap.keys() )
{
qDebug() << outerKey;
const auto& innerMap = outerMap[ outerKey ];
foreach ( const auto& innerKey, innerMap.keys() )
{
const auto& innerValue = innerMap[ innerKey ];
qDebug() << "\t{" << innerKey << "," << innerValue << "}";
}
}
qDebug() << "\n--- range-for (QMap -> std::map) ---";
const auto& m1 = outerMap.toStdMap();
for ( const auto& p1 : m1 )
{
qDebug() << p1.first;
const auto& m2 = p1.second.toStdMap();
for ( const auto& p2 : m2 )
{
qDebug() << "\t{" << p2.first << "," << p2.second << "}";
}
}
qDebug() << "\n--- while (QMapIterator) ---";
QMapIterator<int, InnerMap> outerIt{ outerMap };
while ( outerIt.hasNext() )
{
outerIt.next();
qDebug() << outerIt.key();
QMapIterator<int, QString> innerIt{ outerIt.value() };
while ( innerIt.hasNext() )
{
innerIt.next();
qDebug() << "\t{" << innerIt.key() << "," << innerIt.value() << "}";
}
}
return 0;
}
Выход:
--- foreach (QMap) ---
1
{ 11 , "a" }
{ 12 , "aa" }
2
{ 21 , "bb" }
{ 22 , "b" }
3
{ 22 , "c" }
--- range-for (QMap -> std::map) ---
1
{ 11 , "a" }
{ 12 , "aa" }
2
{ 21 , "bb" }
{ 22 , "b" }
3
{ 22 , "c" }
--- while (QMapIterator) ---
1
{ 11 , "a" }
{ 12 , "aa" }
2
{ 21 , "bb" }
{ 22 , "b" }
3
{ 22 , "c" }