Получение значения из вложенного QMap
У меня есть вложенный QMap QMap <QString, QMap<QString, QVariant> > map
и временный QMap QMap <QString, QVariant> tmpMap
Мне нужно заполнить временный QMap ключами и значениями внутреннего QMap, чтобы я мог
переберите и выведите все значения вложенного QMap.
Это мой код
QMap <QString, QMap<QString, QVariant> > map;
QMap <QString, QVariant> tmpMap;
QList<QString> mapKeys = map.keys();
for(int index = 0; index < mapKeys.size(); ++index)
{
tmpMap.unite(map.value(QString(index)));
QList<QString> tmpMapKeys = tmpMap.keys()
for(int index2 = 0, index2 < tmpMapKeys.size(); ++index2)
{
//Stuff to check and output
}
}
Однако второй цикл for никогда не запускается, поскольку tmpMap никогда ничего не хранит.
3 ответа
QString(index)
не делает то, что вы думаете, что делает. Вы можете думать о QString::number(index)
, но даже тогда это не будет работать, если любой из ключей имеет значения, которые не являются числами в ограниченном диапазоне, по которому вы итерируете. Вы действительно должны были использовать mapKeys.at(index)
: это заставит ваш код работать. Но вы не должны копировать ключи карты в mapKeys
вообще: это преждевременная пессимизация.
К счастью, C++11'делает все это простым и лаконичным. Вы можете использовать range-for для итерации значений - внутренних карт - map
, И вы можете использовать const-итератор выведенного типа, чтобы затем перебрать пары ключ / значение накопленной allInners
карта.
#include <QtCore>
int main() {
QMap<QString, QMap<QString, QVariant>> map;
QMap<QString, QVariant> allInners;
// accumulate the inner keys/values
for (auto const & inner : map)
allInners.unite(inner);
// process the inner keys/values
for (auto it = allInners.cbegin(); it != allInners.cend(); ++it)
qDebug() << it.key() << it.value();
}
Как сказал Платоншубин, ключ в первом цикле не совсем понятен, вместо:
tmpMap.unite(map.value(QString(index)));
пытаться
tmpMap.unite(map.value(mapKeys.at(index)));
Что вы подразумеваете под написанием map.value(QString(index))? Это довольно двусмысленно для меня, по крайней мере. Например, если я напишу QString(0x40), я получу строку с символом @ (код 0x40), и вы, наверное, делаете то же самое, то есть вызываете QString(int). Поэтому постарайтесь писать более подробно.
Для перебора некоторых контейнеров я бы порекомендовал вам использовать итераторы, которые очень полезны. Использование следующее (хотя код не проверен):
QMap <QString, QMap<QString, QVariant> > map;
QMap <QString, QMap<QString, QVariant> >::const_iterator i;
QMap<QString, QVariant>::const_iterator i2;
for (i = map.begin(); i != map.end(); i++)
{
for (i2 = i.value.begin(); i2 != i.value.end(); i2++)
{
//Access to all the keys and values of nested QMap here
//i2.key() is some QString and i2.value() is some QVariant
//Stuff to check and output
}
}
AFAIK, в таких вещах, как QMap, QHash и т. Д. Нет обычных индексов. Если у вас есть какой-то QMap, вам нужно знать точную строку, чтобы получить 'Something' в соответствии с определенной QString. Если "Привет, мир" идет в Something smth
тогда, если вы напишите map.value("Hello, world"), вы получите этот объект "что-то". Для проверки всех записей QMap используйте итераторы, которые я упоминал выше.
Если вам нужно получить что-то по его номеру, я бы порекомендовал вам использовать стандартные массивы, списки, наборы, очереди, стеки и т. Д.
PS Путь kmx78 также должен работать для вас.