Получение значения из вложенного 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 также должен работать для вас.

Другие вопросы по тегам